捕获组在 Select-String 的 -Pattern 末尾不工作
Capturing group not working at end of -Pattern for 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 很陌生,所以我认为这种行为是操作错误。
但是解决方法是什么?这种行为还没有给我带来问题,但考虑到我正在使用的文件(XML 文件中包含的电子手册),我希望它最终会成为问题。
...
问候,
施维特
...
澄清:
我使我的示例非常简单来说明行为,但我最初的问题是这种模式:
$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)"
该文件是我们在手册之间 link 的索引之一,link 的名称包含在文件每一行的注释块中。
该模式实际上是一个拼写错误,因为名称和注释没有一直到行尾。当程序在 Match-Info 对象中找不到 "linkname" 时开始出错时,我发现了它。
一旦我给了它出现在 link 名称 (::
) 之后的字符,它就可以正常工作了。将其放入示例中:
$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 来导航节点和属性。
我最近开始在 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 很陌生,所以我认为这种行为是操作错误。
但是解决方法是什么?这种行为还没有给我带来问题,但考虑到我正在使用的文件(XML 文件中包含的电子手册),我希望它最终会成为问题。
...
问候,
施维特
...
澄清:
我使我的示例非常简单来说明行为,但我最初的问题是这种模式:
$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)"
该文件是我们在手册之间 link 的索引之一,link 的名称包含在文件每一行的注释块中。
该模式实际上是一个拼写错误,因为名称和注释没有一直到行尾。当程序在 Match-Info 对象中找不到 "linkname" 时开始出错时,我发现了它。
一旦我给了它出现在 link 名称 (::
) 之后的字符,它就可以正常工作了。将其放入示例中:
$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 来导航节点和属性。