2016-10-04 78 views
2

我期望的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还显示以下内容作为警告:

重复捕获组将只捕获最后一次迭代。如果你对数据不感兴趣,可以在重复组周围设置一个捕获组来捕获所有迭代或者使用非捕获组

如何更改我的正则表达式模式?

+0

Regex101不支持.NET正则表达式的味道。 –

+0

*在重复组周围放置一个捕获组来捕获所有迭代* – Groo

+0

@Groo我做了,但没有奏效。 –

回答

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

2

也许试试这个:

A|b(C+)? 

测试中Notepad++

编辑:如果你想这种模式与群体:​​

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

它在JavaScript风格和记事本+ +的regex101中工作,但它不适用于Visual Studio,C#。它返回{“A”,“A”,“”,“”} –

+1

同样,如果您对捕捉集合等功能感兴趣,请不要使用regex101来测试.NET正则表达式。有一个像[Expresso](http://www.ultrapico.com/expresso.htm)这样的工具,免费使用并且很好用。 –

+0

@WiktorStribiżew你是对的。你的代码工作。 –