2016-10-04 6 views
2

Я бы ожидать, что эти строки C#:Regex: Как захватить все итерации в многократном захвата группы

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++

Edit: Если вы хотите эту модель с группами:

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

Он работает в regex101 с ароматом javascript и notepad ++, но он не работает в Visual Studio, C#. Он возвращает {"A", "A", "", ""} –

+1

Опять же, не используйте regex101 для тестирования .NET regex, если вас интересуют такие функции, как сбор коллекции. Существует такой инструмент, как [Expresso] (http://www.ultrapico.com/expresso.htm), бесплатный для использования и приятный. –

+0

@ WiktorStribiżew вы правы. ваш код работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^