7
votes

Comment puis-je utiliser Latherbehind dans une regex C # afin de sauver les matchs de préfixes répétés?

Comment puis-je utiliser Lookbehind dans une regex C # regex afin de sauver des correspondances de motifs de préfixe répétés?

Exemple - J'essaie d'avoir l'expression correspondant à tous les caractères B suivant un numéro de A caractères: xxx

renvoie aabbbb , correspondant uniquement à un A . Comment puis-je le faire pour qu'il corresponde à tous les A S au début?

J'ai essayé xxx

et xxx

sans résultats ...

Ce que je m'attends est BBBB . < / p>


1 commentaires

Quel est votre résultat attendu?


3 Réponses :


1
votes

La raison pour laquelle le look-derrière saute le "A" est parce qu'il consomme le premier "A" (mais pas la capturer), alors il capture le reste.

Ce modèle fonctionne-t-il à la place? Nouveau motif: \ ba + (. +) \ B code> Il utilise une limite de mot \ b code> pour ancrer les extrémités du mot. Il correspond au moins un "A" suivi du reste des caractères jusqu'à la fin de la limite de mot. Les caractères restants sont capturés dans un groupe afin que vous puissiez les référencez facilement. P> xxx pré>

mise à jour: strong> Si vous voulez sauter la première occurrence de N'importe quel em> Lettres dupliquées, puis correspondez au reste de la chaîne, vous pouvez le faire: P>

string pattern = @"\b(.)(\1)*(?<Content>.+)\b";

foreach (Match m in Regex.Matches("aaabbbb", pattern))
{
    Console.WriteLine("Match: " + m.Value);
    Console.WriteLine("Group capture: " + m.Groups["Content"].Value);
}


3 commentaires

Faites-le sans avoir 'B' ou 'A' dans votre regex.


@John merci, j'ai été fixé sur la lettre "A" spécifiquement. Mon 2ème échantillon fonctionne avec n'importe quel caractère dupliqué et sans encombre.


D'accord, +1, je dirais que le mien est un peu plus concis, mais cela semble être plus facile à lire.



7
votes

Vous recherchez un groupe de capture répété?

bbbb


2 commentaires

J'ai besoin du groupe Lookebehind pour correspondre à tous les caractères. C'est-à-dire que la correspondance réelle est BBBB, car le groupe de répète a répété devrait être ignoré.


@Luvieere: J'ai fait ce changement.



4
votes

Je l'ai finalement compris:

Regex expression = new Regex("(?<=a+)[^a]+");

foreach (Match result in expression.Matches(@"aaabbbb"))
   MessageBox.Show(result.Value);


0 commentaires