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集合是否总是正好存储两个组:整个匹配和最后一个匹配?

C#中的正则表达式组

  • 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是方括号之间的内容。

如何?答案在这里

(.*?)

这是@"[(.*?)];的子群