当我偶然发现一个与Powershell的[regex]
类匹配不同的奇怪场景时,我在PowerShell中玩正则表达式-match
。在我尝试从字符串中删除空行的情况下,当不使用-replace
我的任何表达式时,[regex]
replace()
将行删除就可以了。
PS C:\Users\Neko> $a = @"
line1
line2
line3
line4
"@
PS C:\Users\Neko> $a -match '\n^\s*$'
false
PS C:\Users\Neko> $b = [regex]::new('\n^\s*$',"IgnoreCase, Multiline")
PS C:\Users\Neko> $b.Matches($a)
Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 5
Length : 1
Value :
Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 18
Length : 1
Value :
在测试过的其他情况下,我还没有看到这种情况,但是我不知道两者之间的差异是什么,或者是什么导致这些不同的结果。这与-replace
(有意义)相同,但是我不知道是什么原因造成的。
那么,PowerShell-match
与-replace
.NET正则表达式类match()
和replace()
方法之间的区别是什么?为什么它们不同?
关键可能是 Multiline
$regex = [regex]'\n^\s*$'
$regexM = [regex]::new('\n^\s*$',"IgnoreCase, Multiline")
$a = @"
line1
line2
line3
line4
"@
$a -match $regex
false
$a -match $regexM
true
还要注意,实际上创建正则表达式在运行时在计算上是昂贵的。我建议在开始时将所有的正则表达式分配在一起,这样您只需要编译一次即可。这也使实际匹配更加可读(如果您选择好名字):
$regex = @{
ExtraWhitespace = [regex]::new('\n^\s*$',"IgnoreCase, Multiline")
}
$a -match $regex.ExtraWhitespace
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句