2016-10-04 2 views
2

j'attendre ces lignes de C#:Regex: Comment capturer toutes les itérations dans le groupe capture répétée

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

pour retourner quelque chose comme:

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

mais il ne retourne que le dernier match capturé :

["AbCCbbCbCCCCbbb", "b"] 

Here Regex101 affiche également les éléments suivants comme un avertissement:

Un groupe de capture répété capture uniquement la dernière itération. Placez un groupe de capture autour du groupe répété pour capturer toutes les itérations ou utilisez un groupe non-capture à la place si les données ne vous intéressent pas

Comment changer mon modèle d'expression régulière?

+0

Regex101 ne supporte pas la saveur .NET regex. –

+0

* Mettre un groupe de capture autour du groupe répété pour capturer toutes les itérations * – Groo

+0

@Groo Je l'ai fait, mais cela n'a pas fonctionné. –

Répondre

2

Si vous voulez capturer également A, juste envelopper avec des parenthèses: new Regex("(A)(bC*)*"). Voir le regex demo.

enter image description here

Ensuite, rassembler toutes les valeurs que vous avez obtenu à l'intérieur 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); 

Voir la C# demo

2

Peut-être essayer ceci:

A|b(C+)? 

Testés dans Notepad++

Edit: Si vous voulez que ce modèle avec les groupes:

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

Cela fonctionne dans regex101 avec la saveur javascript, et notepad ++ mais cela ne fonctionne pas dans Visual Studio, C#. Il renvoie {"A", "A", "", ""} –

+1

Encore une fois, n'utilisez pas regex101 pour tester .NET regex si vous êtes intéressé par les fonctionnalités telles que la capture de capture. Il existe un outil comme [Expresso] (http://www.ultrapico.com/expresso.htm), gratuit et agréable à utiliser. –

+0

@ WiktorStribiżew vous avez raison. votre code fonctionne. –