捕获组不在-Pattern结束时为Select-String工作

时间:2015-09-30 19:40:43

标签: regex powershell capturing-group select-string

我最近开始在Powershell中使用regex,并且遇到了来自Select-String cmdlet的意外响应。

如果您输入以下内容:

$thing = "135" | Select-String -Pattern "(.*?)5"
$thing.Matches

您会收到Match-Info对象的预期结果:

Groups   : {135, 13}
Success  : True
Captures : {135}
Index    : 0
Length   : 3
Value    : 135

但是如果你将捕获组放在-Pattern的末尾:

$thing = "135" | Select-String -Pattern "(.*?)"
$thing.Matches

Match-Info似乎找不到任何东西,虽然创建了一个:

Groups   : {, }
Success  : True
Captures : {}
Index    : 0
Length   : 0
Value    : 

正如我所说的,我对Powershell很新,所以我希望这种行为是操作错误。

但是周围的工作是什么?这种行为还没有引起我的问​​题,但考虑到我正在使用的文件(XML文件中包含的电子手册),我预计它最终会出现。

...

关于,

Schwert酒店

...

澄清:

我让我的例子很简单,以说明行为,但我原来的问题是这个模式:

$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)"

该文件是我们手册之间链接的索引之一,链接名称包含在文件每行的注释块中。

该模式实际上是一个错字,因为名称和注释不会一直到行尾。当程序在Match-Info对象中找不到“linkname”时程序开始出错时,我发现了它。

一旦我给出了链接名称(::)之后出现的字符,它就能正常工作。把它放在例子中:

$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)::"

1 个答案:

答案 0 :(得分:3)

我没有正则表达式专家,但我相信你的模式"(.*?)"就是问题所在。例如,如果删除?,则会按预期获得组。

另外,请不要使用正则表达式来解析XML。 :)有更容易的方法,例如:

[xml]$Manual = Get-Content -Path C:\manual.xml

$xdoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path C:\manual.xml
$xdoc.Load($file)

一旦你以结构化格式获得它,你就可以使用点符号或XPath来导航节点和属性。