当我在PowerShell中玩regex时,我偶然发现了一个奇怪的场景,不同的Powershell的[regex]
类与-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()
方法有什么不同,它们为什么不同?
发布于 2020-11-17 21:32:37
关键可能是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在计算上是昂贵的,而运行它则不是。我建议在开始时分配所有regex 在一起,所以您只编译它们一次。它还提高了实际匹配的可读性(如果您选择好的名称):
$regex = @{
ExtraWhitespace = [regex]::new('\n^\s*$',"IgnoreCase, Multiline")
}
$a -match $regex.ExtraWhitespace
https://stackoverflow.com/questions/64883558
复制相似问题