首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么[regex] match()和-match不同?

为什么[regex] match()和-match不同?
EN

Stack Overflow用户
提问于 2020-11-17 21:25:32
回答 1查看 91关注 0票数 3

当我在PowerShell中玩regex时,我偶然发现了一个奇怪的场景,不同的Powershell的[regex]类与-match匹配。在我试图从字符串中删除空行的情况下,当使用-replace时,在使用[regex] replace()时,没有一个表达式可以很好地删除这些行。

代码语言:javascript
运行
复制
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()方法有什么不同,它们为什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-17 21:32:37

关键可能是Multiline

代码语言:javascript
运行
复制
$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 在一起,所以您只编译它们一次。它还提高了实际匹配的可读性(如果您选择好的名称):

代码语言:javascript
运行
复制
$regex = @{
    ExtraWhitespace = [regex]::new('\n^\s*$',"IgnoreCase, Multiline")
}
$a -match $regex.ExtraWhitespace
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64883558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档