捕获组号

Capturing group number

提问人:Blah 提问时间:2/15/2017 最后编辑:Ansgar WiechersBlah 更新时间:2/15/2017 访问量:1145

问:

我一直在 PowerShell 中使用正则表达式制作解析器,到目前为止它运行良好,除了我遇到的那个问题。

\s*([a-zA-Z_]+)\s*=(?:\s*"(.*)"|([^;#]*))

我制作了这个正则表达式来匹配这些场景,并取得了成功:

Name= "Value" ;Comment

之后会把所有东西都放在引号之间,而忽略其余的=

Name=Value ;Comment

将把所有内容都放在 up 或 as a Value 之后=;#

现在这很好,但我遇到的问题是场景一将匹配为 Value[2],场景二将匹配为 Value[3]。这让我检查哪一个包含最终值的东西,我觉得这些值不干净,而且我确定没有必要。那么问题来了:Value[2] 如何包含这两个不同组的结果?(使用完全不同的正则表达式不是问题,我已经重写了好几次了)

正则表达式 PowerShell 解析 报价

评论

1赞 Faibbus 2/15/2017
像这样的东西怎么样:\S*([a-zA-Z_]+)\s*=\s*(“?)([^"]*?)\2\s*[;#]
0赞 Blah 2/15/2017
这将不再捕获 并且不会捕获 = 之后的空格,如果未指定引号,例如:谢谢Name="Value1;Value2"Name= has been found by
0赞 Ansgar Wiechers 2/15/2017
我认为最好将交替设置为捕获组并在第二步中删除外部双引号:^\s*(\w+)\s*=\s*(".*?"|[^;#]*)
0赞 Faibbus 2/15/2017
或者,如果 powershell 支持分支重置:\S*([a-zA-Z_]+)\s*=(?|\s*“(.*)”|([^;#]*))(你的问题实际上可能是 stackoverflow.com/questions/5377782/ 的重复......)
0赞 Faibbus 2/15/2017
C# 的 php(pcre) 中找到的分支重置运算符 (“?|”) 的等效项是什么?

答:

0赞 Mathias R. Jessen 2/15/2017 #1

使用命名捕获组而不是非捕获组:

$pattern = '\s*([a-zA-Z_]+)\s*=(?<value>\s*"(.*)"|([^;#]*))'
$value = ($string |Select-String -Pattern $pattern).Matches.Groups['value'].Value.Trim(' "')

评论

0赞 Faibbus 2/15/2017
你的答案指向正确的方向,但它包括在比赛中。"
0赞 Faibbus 2/15/2017
是的,但即使这样,如果没有指定引号,则无法在 = 后面捕获空格,例如: 。您可以通过使用相同的名称命名内部组来执行此操作。Name= has been found by
0赞 Blah 2/15/2017
是的,我已经开始使用同名组技巧。我希望有一种方法可以不这样做,因为它不是一个便携式解决方案。这就是我现在使用的:^\s*(?<n>[\w]+)\s*=(?:\s*"(?<v>.*)"|\s*(?<v>[\d]*)\s*|(?<v>[^;#]*))