使用正则表达式结果值的子字符串替换正则表达式

时间:2013-10-04 17:59:33

标签: regex powershell

我一直在阅读大量材料,并认为我找到了解决方案,但没有运气。我需要找到名称中包含的撇号,然后用双精度替换它们。我正在将一个文件加载到一个数组,然后循环遍历它,寻找撇号。问题是每行可以有几个撇号,这就是为什么它不是一个简单的查找和替换。

以下是该文件的示例:

   create(xxxxxxx)using(xxxxxxx)name('O'Doe, John')
   replace(xxxxxxx)instdata('ab 1234 ')
   create(xxxxxxx)using(xxxxxxx)name('Doe, O'Jane')
   replace(xxxxxxx)instdata('ab 5678 ')

中间还有其他行,但它们不包含撇号。

这是我到目前为止所做的:

    $Pattern = "[A-Z]'[A-Z]"
    $user = gc C:\Temp\mfnewuser.ins
    for ($i = 0; $i -lt $user.count; $i++) {
       if ($user[$i] -match $Pattern) {
       $user[$i] = [regex]::replace($strText, $Pattern.substring(2,1), "''")
       $user | out-file C:\Temp\mfnewuser.ins
       }
    }

我正在寻找大写字母,然后是撇号,接着是另一个大写字母。由于其他逗号,我不能只做全局替换。我知道我的模式匹配正在工作,但我似乎无法用子串操纵它。子字符串将$ Pattern视为字符串而不是正则表达式的结果。如果我可以将正则表达式结果保存到变量,那就太好了。我认为替换会很容易。

也试过这个,但也没有运气:

    $Pattern = "[A-Z]'[A-Z]"
    $NewPattern = "[A-Z]''[A-Z]"
    $f = Get-Content C:\Temp\mfnewuser.ins
    $f = $f -replace $Pattern, $NewPattern
    $f | out-file C:\Temp\mfnewuser.ins

我可能正在接近这一切,并且有一种更简单的方法,但我还没有看到任何东西。

修改 基于下面的Bill_Stewarts示例,我已经将其用于名字但尚未使用姓氏:

$Pattern = "[A-Z]'[A-Z]"
$user = gc C:\Temp\mfnewuser.ins
for ($i = 0; $i -lt $user.count; $i++) {
    if ($user[$i] -match $Pattern) {
        $user[$i] = $user[$i] -replace "(.*[A-Z])'([A-Z]+.*)", "`$1''`$2"
        $user | out-file C:\Temp\mfnewuser.ins
        }
    }

2 个答案:

答案 0 :(得分:1)

也许是这样的?

get-content "test.txt" | foreach-object {
  $_ -replace "([A-Z])'([A-Z])", "`$1''`$2"
}

可以使用()对正则表达式进行分组,并且-replace运算符支持子串替换($ 1和$ 2)。

答案 1 :(得分:1)

使用以下内容替换您的行。

$user[$i] = $user[$i] -replace "([A-Z])'([A-Z])", "`$1`''`$2"

或尝试以下之一。这应该足够了。

get-content "mfnewuser.ins" | foreach-object {
  $_ -replace "([A-Z])'([A-Z])", "`$1`''`$2"
} | set-content "mfnewuser.ins"

...

get-content "mfnewuser.ins" | foreach-object {
  $_ -replace "([a-zA-Z', ]+)'([a-zA-Z', ]+)", "`$1`''`$2"
} | set-content "mfnewuser.ins"