C#中的正则表达式组
本文关键字:正则表达式 | 更新日期: 2023-09-27 17:59:24
我继承了一个包含以下regex的代码块,我正在努力了解它是如何获得结果的。
var pattern = @"'[(.*?)']";
var matches = Regex.Matches(user, pattern);
if (matches.Count > 0 && matches[0].Groups.Count > 1)
...
对于输入user == "Josh Smith [jsmith]"
:
matches.Count == 1
matches[0].Value == "[jsmith]"
我理解。但随后:
matches[0].Groups.Count == 2
matches[0].Groups[0].Value == "[jsmith]"
matches[0].Groups[1].Value == "jsmith" <=== how?
从我所理解的角度来看这个问题,Groups集合存储整个匹配以及前一个匹配。但是,上面的regexp不是只匹配[开方括号][文本][闭方括号]吗?为什么"jsmith"会匹配呢?
此外,groups集合是否总是正好存储两个组:整个匹配和最后一个匹配?
match.Groups[0]
总是与match.Value
相同,这是整个匹配match.Groups[1]
是正则表达式中的第一个捕获组
考虑这个例子:
var pattern = @"'[(.*?)'](.*)";
var match = Regex.Match("ignored [john] John Johnson", pattern);
在这种情况下,
match.Value
就是"[john] John Johnson"
match.Groups[0]
总是与match.Value
、"[john] John Johnson"
相同- CCD_ 10是来自CCD_
- CCD_ 12是来自CCD_
- CCD_ 14是另一个维度
考虑另一个例子:
var pattern = @"('[.*?'])+";
var match = Regex.Match("[john][johnny]", pattern);
请注意,我们正在一行中查找一个或多个带括号的名称。您需要能够分别获得每个名称。输入Captures
!
match.Groups[0]
总是与match.Value
、"[john][johnny]"
相同- CCD_ 19是来自CCD_。在这种情况下与
match.Value
相同 match.Groups[1].Captures[0]
与match.Groups[1].Value
相同match.Groups[1].Captures[1]
就是[john]
match.Groups[1].Captures[2]
就是[johnny]
( )
充当捕获组。因此matches数组包含C#在字符串中找到的所有匹配项,子数组包含这些匹配项中的捕获组的值。如果你不想要额外级别的捕捉,请移除( )
。
Groups[0]
是您的整个输入字符串。
Groups[1]
是用括号(.*?)
捕获的组。您可以将Regex配置为仅捕获显式组(在创建Regex时有一个选项),或者使用(?:.*?)
创建非捕获组。
括号也标识一个组,因此匹配1是整个匹配,匹配2是方括号之间的内容。
如何?答案在这里
(.*?)
这是@"[(.*?)];的子群