我最近开始在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>.*?)::"
答案 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来导航节点和属性。