正则表达式组和其他变量的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 {
$_
}
}
不是最漂亮的代码,但它可以工作。
我正在尝试使用正则表达式来匹配和替换文件中的文本。我也在使用捕获组。在替换文本中,我使用了捕获组和其他我想要扩展的变量。问题是,当其他变量的值以数字开头时,它们会被扩展,我假设他们正试图扩展为一个不存在的捕获组。
这是替换前的文字
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 {
$_
}
}
不是最漂亮的代码,但它可以工作。