Regex 将-SimpleMatch与选择字符串一起使用时未捕获匹配项

Regex 将-SimpleMatch与选择字符串一起使用时未捕获匹配项,regex,powershell,escaping,select-string,Regex,Powershell,Escaping,Select String,我一直在使用正则表达式解析一些XML节点中的文本。但是,当我将-SimpleMatch与选择字符串一起使用时,MatchInfo对象似乎不包含任何匹配项 我在网上找不到任何迹象表明这种行为是正常的。我现在想知道这是否是我的Powershell安装。(仅供参考:我使用的计算机已安装Powershell 3.0。) 使用一个非常简单的示例,我们可以在使用正则表达式模式时返回预期的MatchInfo对象: PS H:\> $c = "abd 14e 568" | Select-String -P

我一直在使用正则表达式解析一些XML节点中的文本。但是,当我将
-SimpleMatch
选择字符串一起使用时,MatchInfo对象似乎不包含任何匹配项

我在网上找不到任何迹象表明这种行为是正常的。我现在想知道这是否是我的Powershell安装。(仅供参考:我使用的计算机已安装Powershell 3.0。)

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

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:\>
$c
输送到
获取成员
确认已返回MatchInfo对象:

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:\> 
我不确定如何解释结果,也不确定为什么会发生这种情况

这种行为是有问题的,因为有很多次我必须搜索包含正则表达式特殊字符的字符串,()非常常见

扩展示例:

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:\> 
我发现的解决方法(这里是这样)是使用.NET中的Regex.Escape方法:
(参考资料:)

由于此解决方案从
Select String
返回预期匹配项,因此我能够继续编写脚本

但我很好奇为什么在使用
-SimpleMatch
参数时不返回匹配项


关于,

Schwert

获取帮助选择字符串-参数SimpleMatch

-SimpleMatch[
]

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


因此,
SimpleMatch
只需在每个字符串中搜索
$Pattern
。它返回一个
MatchInfo
对象,其中包含字符串和相关上下文信息(如果存在),但没有
匹配
,因为从未对字符串执行过适当的正则表达式匹配-它就这么简单

System.Text.RegularExpressions.Match
是正则表达式对象,因此,如果不使用正则表达式,则不会得到
Match
对象。@PetSerAl:我以前没有将
Matches
对象管道传输到
get Member
。这样做确实会将
System.Text.RegularExpressions.Match
作为类型名。我更仔细地查看了Microsoft开发人员网络上的
MatchInfo
信息,特别是“Match”类,发现如下内容:“表示单个正则表达式匹配的结果。”这并不是最明显的地方,但我认为
匹配
对象对于
SimpleMatch
是不必要的,因为它应该只是原始的搜索字符串。@SchwertimStein清楚地指出:“这个对象是由Select string cmdlet返回的。它提供了有关匹配结果的信息。”-它没有暗示这是基于正则表达式的匹配还是简单的匹配,我应该为我引用的页面添加一个链接:@PetSerAl评论了
匹配信息
对象的
部分是如何匹配
系统.Text.RegularExpressions.match
类型的。为了更好地理解他的评论,我找到了上面提到的Match类文章。我对
Matches
部分的评论是,如果
Matches
包含一个带有
SimpleMatch
的值,它将是原始搜索字符串。因此,
匹配项中没有任何内容。
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)