regex - 捕获组在 Select-String 的 -Pattern 末尾不起作用

标签 regex powershell capturing-group select-string

我最近开始在 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

尽管创建了匹配信息,但匹配信息似乎没有找到任何内容:

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

正如我所说,我对 Powershell 还很陌生,所以我预计这种行为是运算符(operator)错误。

但是解决办法是什么?此行为尚未给我带来问题,但考虑到我正在使用的文件(XML 文件中包含的电子手册),我预计最终会出现问题。

...

此致,

施韦特

...

澄清:

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

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

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

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

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

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

最佳答案

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

此外,请不要使用正则表达式来解析 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 来导航节点和属性。

关于regex - 捕获组在 Select-String 的 -Pattern 末尾不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874311/

相关文章:

python - 重复正则表达式组

javascript - 正则表达式:\d 不工作

Azure PowerShell Runbook 不支持 System.Data.OleDb.OleDbConnection

powershell - 康威的生活 |电源外壳

regex - 我们如何匹配 a^n b^n?

regex - 如何在 Notepad++ 正则表达式中使用超过九个反向引用?

php - preg_replace 双重替换

powershell - 无法使用来自 PowerShell 的 Invoke-Webrequest 为 SSL/TLS 安全通道建立信任关系

regex - Scala 正则表达式命名捕获组

regex - 在 fluentd 中使用正则表达式解析 json 数据时出错