C#中的正则表达式组

Les*_*ter 46 c# regex

我继承了一个包含以下正则表达式的代码块,我试图了解它是如何得到它的结果的.

var pattern = @"\[(.*?)\]";
var matches = Regex.Matches(user, pattern);
if (matches.Count > 0 && matches[0].Groups.Count > 1)
    ...
Run Code Online (Sandbox Code Playgroud)

输入user == "Josh Smith [jsmith]":

matches.Count == 1
matches[0].Value == "[jsmith]"
Run Code Online (Sandbox Code Playgroud)

......我明白了.但是之后:

matches[0].Groups.Count == 2
matches[0].Groups[0].Value == "[jsmith]"
matches[0].Groups[1].Value == "jsmith" <=== how?
Run Code Online (Sandbox Code Playgroud)

看着这个问题从我了解的群体集合存储在整场比赛以及之前的比赛.但是,上面的正则表达式是否只与[空方括号] [文本] [关闭方括号]匹配,那么为什么"jsmith"会匹配?

此外,群组集合是否总是存储2组:整场比赛和最后一场比赛?

age*_*t-j 105

  • match.Groups[0]总是相同match.Value,这是整场比赛.
  • match.Groups[1] 是正则表达式中的第一个捕获组.

考虑这个例子:

var pattern = @"\[(.*?)\](.*)";
var match = Regex.Match("ignored [john] John Johnson", pattern);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,

  • match.Value"[john] John Johnson"
  • match.Groups[0]总是一样的match.Value,"[john] John Johnson".
  • match.Groups[1]是一组来自的(.*?).
  • match.Groups[2]是一组来自的(.*).
  • match.Groups[1].Captures 是另一个维度.

考虑另一个例子:

var pattern = @"(\[.*?\])+";
var match = Regex.Match("[john][johnny]", pattern);
Run Code Online (Sandbox Code Playgroud)

请注意,我们正在寻找连续的一个或多个括号内的名称.您需要能够单独获取每个名称.进入Captures!

  • match.Groups[0]总是一样的match.Value,"[john][johnny]".
  • match.Groups[1]是一组来自的(\[.*?\])+.与match.Value此案例相同.
  • match.Groups[1].Captures[0] 是相同的 match.Groups[1].Value
  • match.Groups[1].Captures[1][john]
  • match.Groups[1].Captures[2][johnny]

  • 这个答案是帮助我把它放在一起的答案(看起来像投票,其他人感觉相同),似乎更正确地解决了问题,而不是接受的答案. (4认同)

zel*_*lio 24

( )充当捕获基团.因此,matches数组具有C#在您的字符串中找到的所有匹配项,并且子数组具有这些匹配项中的捕获组的值.如果你不想要那个额外级别的捕获jut删除了( ).

  • 如果您不想捕获该组,请使用"非捕获组".`(?:正则表达式)`.正则表达式参考:http://www.regular-expressions.info/refadv.html (4认同)