2

我最近开始在 Powershell 中使用正则表达式,并且遇到了来自 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 文件中包含的电子手册),我希望它最终会发生。

...

带着敬意,

施韦特

...

澄清:

我让我的例子非常简单来说明行为,但我最初的问题是这种模式:

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

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

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

一旦我给它链接名称(::)之后出现的字符,它就可以正常工作。将其放入示例中:

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

1 回答 1

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 来导航节点和属性。

于 2015-09-30T19:47:16.137 回答