2016-10-04 49 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你是對的。你的代碼工作。 –