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 字符。