当使用-SimpleMatch和Select-String时,不捕获匹配



我一直在使用regex解析一些XML节点中的文本。但是,当我将-SimpleMatchSelect-String一起使用时,MatchInfo对象似乎不包含任何匹配项。

我无法在网上找到任何表明这种行为是正常的。我现在想知道这是否是我的Powershell安装。(参考:我使用的电脑安装了Powershell 3.0)

使用一个非常简单的例子,当使用正则表达式模式时,我们可以返回预期的MatchInfo Object:

PS H:> $c = "abd 14e 568" | Select-String -Pattern "ab"
PS H:> $c.Matches

Groups   : {ab}
Success  : True
Captures : {ab}
Index    : 0
Length   : 2
Value    : ab

但是添加-SimpleMatch参数似乎没有返回MatchInfo对象中的Matches属性:

PS H:> $c = "abd 14e 568" | Select-String -Pattern "ab" -SimpleMatch
PS H:> $c.Matches
PS H:>

管道$cGet-Member确认返回了一个匹配对象:

PS H:> $c | gm

   TypeName: Microsoft.PowerShell.Commands.MatchInfo
Name         MemberType Definition                                                       
----         ---------- ----------                                                       
Equals       Method     bool Equals(System.Object obj)                                   
GetHashCode  Method     int GetHashCode()                                                
GetType      Method     type GetType()                                                   
RelativePath Method     string RelativePath(string directory)                            
ToString     Method     string ToString(), string ToString(string directory)             
Context      Property   Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
Filename     Property   string Filename {get;}                                           
IgnoreCase   Property   bool IgnoreCase {get;set;}                                       
Line         Property   string Line {get;set;}                                           
LineNumber   Property   int LineNumber {get;set;}                                        
Matches      Property   System.Text.RegularExpressions.Match[] Matches {get;set;}        
Path         Property   string Path {get;set;}                                           
Pattern      Property   string Pattern {get;set;}                                        

和其他属性,如图案和线条:

PS H:> $c.Pattern
ab
PS H:> $c.Line
abd 14e 568

同样,当向Matches数组发送索引值时不会产生错误:

PS H:> $c.Matches[0]
PS H:> 

我不确定如何解释这些结果,也不确定为什么会发生。

这个行为是有问题的,因为很多时候我必须搜索包含regex特殊字符的字符串,()是非常常见的。

扩展示例:

PS H:> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)"
PS H:> $c.Matches
PS H:> 

$c.Matches不返回任何值,$c本身是空的,因为在正则表达式模式中使用了括号:

PS H:> $c -eq $null
True

使用-SimpleMatch确实产生了一个MatchInfo对象,但仍然没有返回任何匹配:

PS H:> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)" -SimpleMatch
PS H:> $c -eq $null
False
PS H:> $c.Matches
PS H:> 

我找到的解决方法(在SO上)是使用正则表达式。.NET中的转义方法:
(参考:Powershell select-string由于转义序列而失败)

PS H:> $pattern = "ab(d)"
$pattern = ([regex]::Escape($pattern))
$c = "ab(d) 14e 568" | Select-String -Pattern $pattern
PS H:> $c.Matches

Groups   : {ab(d)}
Success  : True
Captures : {ab(d)}
Index    : 0
Length   : 5
Value    : ab(d)

由于此解决方案返回Select-String的预期匹配,因此我已经能够继续编写脚本。

但是我很好奇为什么使用-SimpleMatch参数时没有返回匹配。


…关于,
Schwert

From Get-Help Select-String -Parameter SimpleMatch:

-SimpleMatch [<SwitchParameter>]

使用简单匹配而不是正则表达式匹配。在一个简单的匹配中,Select-String在Pattern参数中搜索输入中的文本。不将Pattern形参的值解释为正则表达式语句。

因此,SimpleMatch只是在您管道到它的每个字符串中对$Pattern进行子字符串搜索。它返回一个MatchInfo对象,其中包含字符串和相关的上下文信息(如果存在),但没有Matches,因为从未对字符串执行适当的正则表达式匹配—就像

相关内容

  • 没有找到相关文章

最新更新