Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的正则表达式组#_C#_Regex - Fatal编程技术网

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);