正则表达式:如何捕获重复捕获组中的所有迭代

时间:2016-10-04 06:57:18

标签: c# .net regex capturing-group

我希望这些C#行:

var regex = new Regex("A(bC*)*");
var match = regex.Match("AbCCbbCbCCCCbbb");
var groups = match.Groups;

返回类似的内容:

["AbCCbbCbCCCCbbb", "A", "bCC", "b", "bC", "bCCC", "b", "b", "b"]

但它只返回最后一次捕获的匹配:

["AbCCbbCbCCCCbbb", "b"]

Here Regex101还会显示以下警告:

  

重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组

我应该如何更改正则表达式?

2 个答案:

答案 0 :(得分:2)

也许试试这个:

A|b(C+)?

Notepad++

中测试过

编辑:如果您希望此模式包含组:

(A)|(b(C+)?)

答案 1 :(得分:2)

如果您还要捕获A,请使用括号括起来:new Regex("(A)(bC*)*")。请参阅regex demo

enter image description here

然后,收集CaptureCollection内所有的值:

var regex = new Regex("(A)(bC*)*");
var match = regex.Matches("AbCCbbCbCCCCbbb")
     .Cast<Match>()
     .SelectMany(x => x.Groups.Cast<Group>()
          .SelectMany(v => v.Captures
              .Cast<Capture>()
              .Select(t => t.Value)
          )
     )
     .ToList();
 foreach (var s in match)
     Console.WriteLine(s);

请参阅C# demo