我有一个关于正则表达式的问题。我想知道是否有可能在powershell中评估正则表达式的匹配结果上的数学表达式?我不能用powershell来求值,只能用正则表达式。
问题陈述:
我有一个类似下面的代码:
$id = $reader.GetValue(0).ToString();
$col1 = $reader.GetValue(1).ToString();
$col2 = $reader.GetValue(2).ToString();
$col3 = $reader.GetValue(3).ToString();
$col4 = $reader.GetValue(4).ToString();
$col5 = $reader.GetValue(5).ToString();
$col6 = $reader.GetValue(6).ToString();
$col7 = $reader.GetValue(7).ToString();
...
我需要增加3个索引0,1,2等在GetValue()文本与查找&替换Powershell ISE对话框。
结果应该是这样的:
$id = $reader.GetValue(3).ToString();
$col1 = $reader.GetValue(4).ToString();
$col2 = $reader.GetValue(5).ToString();
$col3 = $reader.GetValue(6).ToString();
$col4 = $reader.GetValue(7).ToString();
$col5 = $reader.GetValue(8).ToString();
$col6 = $reader.GetValue(9).ToString();
$col7 = $reader.GetValue(10).ToString();
...
I was try
Find what: GetValue((d))
Replace with: GetValue($1+3)
但是我没有成功,我找不到任何关于这个问题的文件或合理的解决方案。
事先非常感谢任何可能的解决方案。
可以使用
PS> $s = '$col1 = $reader.GetValue(1).ToString();'
PS> $rx = [regex]'(?<=GetValue()d+(?=))'
PS> $rx.Replace($s, { param($m) [int]$m.Value + 1 })
$col1 = $reader.GetValue(2).ToString();
细节:
- 正则表达式模式在这里被编译为一个正则表达式对象
- 模式被重写为只消耗一个或多个数字,其余部分被包装为非消耗的查找(
(?<=GetValue()
是正向向后查找,(?=))
是正向正向向前查找),以便进一步的匹配操作可以更简单 - 使用带匹配求值器的
Regex.Replace
方法,{ param($m) [int]$m.Value + 1 }
部分取匹配值(d+
匹配的),将字符串转换为整数值,加上1
,并将结果放回,而不是消耗的数字。
参见regex演示。细节:
(?<=GetValue()
-在当前位置的左侧,必须有GetValue(
文本d+
-一个或多个数字(?=))
-在当前位置的右边,必须有一个)
字符。