Negative Lookbehind 在编辑器中有效,但在 Powershell 脚本中无效
Negative Lookbehind Works in Editor But Not in Powershell Script
使用以下内容。我正在尝试用逗号-space 替换字符串中所有实例的 spaces。同时避免重复字符串中已经存在的逗号。
测试字符串:
'186 ATKINS, Cindy Maria 25 Every Street Smalltown, Student'
使用以下代码:
Get-Content -Path $filePath |
ForEach-Object {
$match = ($_ | Select-String $regexPlus).Matches.Value
$c = ($_ | Get-Content)
$c = $c -replace $match,', '
$c
}
输出为:
'186, ATKINS,, Cindy, Maria, 25, Every, Street, Smalltown,, Student'
我的$regexPlus
值为:
$regexPlus = '(?s)(?<!,)\s'
我已经在我的编辑器中测试了负面回顾断言并且它有效。为什么它在这个 Powershell 脚本中不起作用?正则表达式 101 在线编辑器产生了这种对区分大小写的奇怪提及:
Negative Lookbehind (?<!,)
Assert that the Regex below does not match
, matches the character , with index 4410 (2C16 or 548) literally (case sensitive)
我尝试编辑为:
$match = ($_ | Select-String $regexPlus -CaseSensitive).Matches.Value
但还是不行。欢迎任何想法。
这里的部分问题是您试图强制通过正则表达式进行替换,就像@WiktorStribiżew 提到的那样,只需像应该使用的那样使用 -replace
。即 -replace
为您完成所有艰苦的工作。
当你这样做时:
$match = ($_ | Select-String $regexPlus).Matches.Value
你是对的,你正在尝试查找正则表达式匹配项。恭喜!它找到了一个 space 字符,但是当你这样做时:
$c = $c -replace $match,', '
它将 $match
解释为 space 字符 ,如下所示:
$c = $c -replace ' ',', '
并且不是您可能一直期望的正则表达式。这就是为什么它没有看到逗号的负面回顾,因为它正在搜索的只是 spaces,并且它尽职尽责地将所有 spaces 替换为逗号 spaces.
解决方案很简单,您只需在 -replace
字符串中使用正则表达式 text:
$regexPlus = '(?s)(?<!,)\s'
$c = $c -replace $regexPlus,', '
例如像宣传的那样工作的负面回顾:
PS C:> $str = '186 ATKINS, Cindy Maria 25 Every Street Smalltown, Student'
PS C:> $regexPlus = '(?s)(?<!,)\s'
PS C:> $str -replace $regexPlus,', '
186, ATKINS, Cindy, Maria, 25, Every, Street, Smalltown, Student
您可以使用
(Get-Content -Path $filePath) -replace ',*\s+', ', '
此代码用单个逗号 + space.
替换零个或多个逗号及其后的所有一个或多个白色 space
参见regex demo。
更多详情:
,*
- 零个或多个逗号
\s+
- 一个或多个白色space 字符。
使用以下内容。我正在尝试用逗号-space 替换字符串中所有实例的 spaces。同时避免重复字符串中已经存在的逗号。
测试字符串:
'186 ATKINS, Cindy Maria 25 Every Street Smalltown, Student'
使用以下代码:
Get-Content -Path $filePath |
ForEach-Object {
$match = ($_ | Select-String $regexPlus).Matches.Value
$c = ($_ | Get-Content)
$c = $c -replace $match,', '
$c
}
输出为:
'186, ATKINS,, Cindy, Maria, 25, Every, Street, Smalltown,, Student'
我的$regexPlus
值为:
$regexPlus = '(?s)(?<!,)\s'
我已经在我的编辑器中测试了负面回顾断言并且它有效。为什么它在这个 Powershell 脚本中不起作用?正则表达式 101 在线编辑器产生了这种对区分大小写的奇怪提及:
Negative Lookbehind (?<!,)
Assert that the Regex below does not match
, matches the character , with index 4410 (2C16 or 548) literally (case sensitive)
我尝试编辑为:
$match = ($_ | Select-String $regexPlus -CaseSensitive).Matches.Value
但还是不行。欢迎任何想法。
这里的部分问题是您试图强制通过正则表达式进行替换,就像@WiktorStribiżew 提到的那样,只需像应该使用的那样使用 -replace
。即 -replace
为您完成所有艰苦的工作。
当你这样做时:
$match = ($_ | Select-String $regexPlus).Matches.Value
你是对的,你正在尝试查找正则表达式匹配项。恭喜!它找到了一个 space 字符,但是当你这样做时:
$c = $c -replace $match,', '
它将 $match
解释为 space 字符 ,如下所示:
$c = $c -replace ' ',', '
并且不是您可能一直期望的正则表达式。这就是为什么它没有看到逗号的负面回顾,因为它正在搜索的只是 spaces,并且它尽职尽责地将所有 spaces 替换为逗号 spaces.
解决方案很简单,您只需在 -replace
字符串中使用正则表达式 text:
$regexPlus = '(?s)(?<!,)\s'
$c = $c -replace $regexPlus,', '
例如像宣传的那样工作的负面回顾:
PS C:> $str = '186 ATKINS, Cindy Maria 25 Every Street Smalltown, Student'
PS C:> $regexPlus = '(?s)(?<!,)\s'
PS C:> $str -replace $regexPlus,', '
186, ATKINS, Cindy, Maria, 25, Every, Street, Smalltown, Student
您可以使用
(Get-Content -Path $filePath) -replace ',*\s+', ', '
此代码用单个逗号 + space.
替换零个或多个逗号及其后的所有一个或多个白色 space参见regex demo。
更多详情:
,*
- 零个或多个逗号\s+
- 一个或多个白色space 字符。