正则表达式组和其他变量的Powershell扩展

Powershell expansion of regular expression groups and other variables

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

这是替换前的文字

merchantId="101"

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

01"

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

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

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

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

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

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

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

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

但是你真的不需要按照你现在的方式去做。既然您只是完全替换该值而不关心以前的值,为什么不直接覆盖呢?

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

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