C# C语言中的正则表达式组#
我继承了一个包含以下正则表达式的代码块,我试图理解它是如何得到结果的C# C语言中的正则表达式组#,c#,regex,C#,Regex,我继承了一个包含以下正则表达式的代码块,我试图理解它是如何得到结果的 var pattern = @"\[(.*?)\]"; var matches = Regex.Matches(user, pattern); if (matches.Count > 0 && matches[0].Groups.Count > 1) ... 对于输入user==“Josh Smith[jsmith]”: 。。。我明白。但是: matches[0].Groups.Count
var pattern = @"\[(.*?)\]";
var matches = Regex.Matches(user, pattern);
if (matches.Count > 0 && matches[0].Groups.Count > 1)
...
对于输入user==“Josh Smith[jsmith]”
:
。。。我明白。但是:
matches[0].Groups.Count == 2
matches[0].Groups[0].Value == "[jsmith]"
matches[0].Groups[1].Value == "jsmith" <=== how?
匹配[0]。Groups.Count==2
匹配[0]。组[0]。值=“[jsmith]”
匹配[0]。组[1]。值==“jsmith”括号也用于标识组,因此匹配1是整个匹配,匹配2是方括号之间找到的内容。?答案就在这里
(.*?)
这是一个由“@[(.*)”;组成的子组,()
充当捕获组。因此,matches数组包含C在字符串中找到的所有匹配项,并且子数组包含这些匹配项中的捕获组值。如果您不想获得额外级别的捕获,请删除()
组[0]
是整个输入字符串
Groups[1]
是用括号(.*)
捕获的组。您可以将Regex配置为仅捕获显式组(创建Regex时有一个选项),或使用(?:.*)
创建非捕获组。
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.group[0]
始终与match.Value
,“[john]john Johnson”
相同
match.Groups[1]
是来自(.*)
的捕获组
match.Groups[2]
是来自(.*)
的捕获组
match.Groups[1]。捕获
是另一个维度
考虑另一个例子:
var pattern = @"(\[.*?\])+";
var match = Regex.Match("[john][johnny]", pattern);
请注意,我们正在一行中查找一个或多个括号内的名称。您需要能够分别获取每个名称。输入捕获
match.Groups[0]
始终与match.Value
,“[john][johny]”
相同
match.Groups[1]
是来自(\[.*.\])+
的捕获组。在本例中与match.Value
相同
match.Groups[1]。捕获[0]
与match.Groups[1]相同。值
match.Groups[1]。捕获[1]
is[john]
match.Groups[1]。捕获[2]
是[johnny]
如果您不想捕获组,请使用非捕获组(?:regex)
。regex参考:Correct BrunoLM::如果您需要逻辑组但不想捕获它。这个答案帮助我将其组合在一起(从投票中看,其他人也有相同的感觉),似乎比公认的答案更能正确地回答问题。
var pattern = @"(\[.*?\])+";
var match = Regex.Match("[john][johnny]", pattern);