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

时间:2015-09-09 12:54:23

标签: regex powershell variable-expansion

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

以下是替换

之前的文字
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"
}

商家总是一个数字,所以当用户为商家输入101这样的东西时,替换文本看起来像是扩展到1101美元,所以我认为powershell正在寻找第1101个被捕获的组,当然这不是& #39; t存在。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

然而,你真的不需要按照自己的方式去做。既然你只是完全取代价值而不关心以前的价值,为什么不直接覆盖?

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

不是最漂亮的代码,但它有效。