提问人:Blah 提问时间:2/15/2017 最后编辑:Ansgar WiechersBlah 更新时间:2/15/2017 访问量:1145
捕获组号
Capturing group number
问:
我一直在 PowerShell 中使用正则表达式制作解析器,到目前为止它运行良好,除了我遇到的那个问题。
\s*([a-zA-Z_]+)\s*=(?:\s*"(.*)"|([^;#]*))
我制作了这个正则表达式来匹配这些场景,并取得了成功:
Name= "Value" ;Comment
之后会把所有东西都放在引号之间,而忽略其余的=
Name=Value ;Comment
将把所有内容都放在 up 或 as a Value 之后=
;
#
现在这很好,但我遇到的问题是场景一将匹配为 Value[2],场景二将匹配为 Value[3]。这让我检查哪一个包含最终值的东西,我觉得这些值不干净,而且我确定没有必要。那么问题来了:Value[2] 如何包含这两个不同组的结果?(使用完全不同的正则表达式不是问题,我已经重写了好几次了)
答:
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>[^;#]*))
评论
\S*([a-zA-Z_]+)\s*=\s*(“?)([^"]*?)\2\s*[;#]
Name="Value1;Value2"
Name= has been found by
^\s*(\w+)\s*=\s*(".*?"|[^;#]*)
[a-zA-Z_]+)\s*=(?|\s*“(.*)”|([^;#]*))
(你的问题实际上可能是 stackoverflow.com/questions/5377782/ 的重复......)