0

我正在尝试使用正则表达式来匹配和替换文件中的文本。我也在使用捕获组。在替换文本中,我使用了我想要扩展的捕获组和其他变量。问题是,当其他变量的值以数字开头时,它们会被扩展,我假设正在尝试扩展为不存在的捕获组。

这是替换前的文字

merchantId="101"

这是替换后的文本,使用 101 作为 Read-Host 命令的输入。

$1101"

并使用它来匹配和替换文本

$merchant = Read-Host 'What merchant would you like to use?'
$configPath = '..\src\config.cfg'

(Get-Content $configPath) | ForEach-Object {
    $_ -replace "(merchantId="").*("")\s*$", "`$1$merchant`$2"
}

Merchant 始终是一个数字,因此当用户为商家输入类似 101 的内容时,替换文本看起来好像已扩展到 $1101,因此我假设 powershell 正在寻找当然不存在的第 1101 个捕获的组。

我是 powerhsell 的新手,语法对我来说有点奇怪,不知道该怎么做。

4

1 回答 1

1

你的假设是正确的。不确定 PowerShell 或正则表达式引擎是否有问题,但它正在尝试查找不存在的捕获组。发生这种情况时,将返回字符串文字。如果您$merchant是按字母顺序排列的,则不会出现此问题。

PetSerAl提供了一个简单的解决方案。它区分了变量和捕获组。

$_ -replace "(merchantId="").*("")\s*$", "`${1}$merchant`$2"

但是,您真的不需要按照自己的方式进行操作。既然您只是完全替换该值并且不在乎以前的值,为什么不直接覆盖?

(Get-Content $configPath) | ForEach-Object {
    If($_ -match "^merchantId="){
        'merchantId="{0}"' -f $merchant
    } else {
        $_
    }
}

不是最漂亮的代码,但它可以工作。

于 2015-09-09T15:34:03.140 回答