请问关于C#中的正则表达式组

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


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?

看着这个问题从我了解的群体集合存储在整场比赛以及之前的比赛。但是,上面的正则表达式不只适用于[方括号] [文本] [方括号],那么“ jsmith”为什么会匹配?


另外,groups集合是否总是会精确地存储2个组:整个匹配项和最后一个匹配项?


米琪卡哇伊
浏览 273回答 3
3回答

慕森卡

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"。match.Groups[1]是来自的捕获物组(.*?)。match.Groups[2]是来自的捕获物组(.*)。match.Groups[1].Captures 是另一个维度。考虑另一个示例:var pattern = @"(\[.*?\])+";var match = Regex.Match("[john][johnny]", pattern);请注意,我们正在连续查找一个或多个带括号的名称。您需要能够分别获得每个名称。输入Captures!match.Groups[0]始终是一样的match.Value,"[john][johnny]"。match.Groups[1]是来自的捕获物组(\[.*?\])+。与match.Value这种情况相同。match.Groups[1].Captures[0] 是相同的 match.Groups[1].Valuematch.Groups[1].Captures[1] 是 [john]match.Groups[1].Captures[2] 是 [johnny]

繁花如伊

Groups[0] 是您的整个输入字符串。Groups[1]是您的组被括号所捕获(.*?)。您可以将正则表达式配置为仅捕获显式组(创建正则表达式时有一个选项),或用于(?:.*?)创建非捕获组。
打开App,查看更多内容
随时随地看视频慕课网APP