Überlappende Übereinstimmungen mit Regex in C # zählen

8

Der folgende Code wertet 2 statt 4 aus:

%Vor%

Ich vermute, dass die Regex nach dem nächsten Spiel vom Ende des vorherigen Spiels sucht. Gibt es einen Weg dies zu verhindern? Ich habe eine Reihe von '0's und' 2's und ich versuche zu zählen, wie oft ich drei '2's hintereinander, vier' 2's hintereinander usw. habe.

    
KristjanJonsson 13.08.2012, 22:09
quelle

5 Antworten

8

Dies gibt 4 wie erwartet zurück:

%Vor%

Der Lookahead stimmt mit dem 20 ohne konsumierenden überein, sodass der nächste Match-Versuch an der Position beginnt, die dem ersten 0 folgt. Sie können sogar die ganze Regex als Lookahead machen:

%Vor%

Die Regex-Engine stößt bei jeder Übereinstimmung mit einer Länge von null automatisch um eine Position nach vorn. Um also alle Läufe von drei 2 oder vier 2 zu finden, können Sie Folgendes verwenden:

%Vor%

... und:

%Vor%

BEARBEITEN: Wenn Sie erneut auf Ihre Frage schauen, fällt mir auf, dass Sie vielleicht nach 2 mit 0 s

suchen %Vor%

Wenn Sie nicht wissen, wie viele 0 es gibt, können Sie folgendes verwenden:

%Vor%

Und natürlich können Sie Quantifier verwenden, um Wiederholungen in der Regex zu reduzieren:

%Vor%     
Alan Moore 13.08.2012, 22:24
quelle
4

Tatsächlich wird ein regulärer Ausdruck dort fortgesetzt, wo der letzte endete. Sie können dies umgehen, indem Sie Lookahead-Muster verwenden. Ich bin kein .NET-Typ, aber probiere das aus: "(?=020)." Übersetzung: "Finde ein beliebiges einzelnes Zeichen, wobei dieses Zeichen und die nächsten beiden Zeichen 020 sind". Der Trick ist, dass die Übereinstimmung nur ein Zeichen breit ist, nicht drei, so dass Sie alle Übereinstimmungen in der Zeichenfolge erhalten, auch wenn sie sich überschneiden.

(Sie könnten es auch als "0(?=20)" schreiben, aber das ist zumindest für Menschen weniger klar: p)

    
Amadan 13.08.2012 22:15
quelle
1

Versuchen Sie dies, indem Sie positives Lookhindo mit der Breite Null verwenden:

%Vor%

Arbeitete für mich, ergibt 4 Treffer.

Meine Lieblingsreferenz für Regex: Regular Expression Language - Kurzanleitung Auch ein schneller Weg, um Regex auszuprobieren, verwende ich oft für komplexe Regex: Free Regular Expression Designer

    
crlanglois 13.08.2012 22:22
quelle
0

Wenn Sie tatsächlich Sequenzen aufeinanderfolgender 2 -s suchen, gibt es eine weitere Option , ohne Lookaheads zu verwenden . (Dies würde nicht für beliebige Sequenzen funktionieren, in denen Sie nach Mustern von 0 und 2 suchen.)

Zählen Sie alle Vorkommen von nicht überlappenden Folgen von drei oder mehr 2 -s auf (wie?) und schließen Sie dann die Anzahl der kürzeren Teilfolgen ab.

Wenn Sie beispielsweise eine Folge von sechs aufeinanderfolgenden 2 -s und eine von fünf aufeinanderfolgenden 2 -s finden, wissen Sie, dass Sie (6-3 + 1) + (5-3 + 1) =? Sequenzen von drei aufeinanderfolgenden 2 -s (möglicherweise überlappend) und so weiter:

%Vor%

Bei großen Strings sollte dies etwas schneller sein als bei Lookaheads.

    
krlmlr 13.08.2012 22:21
quelle
-4

Weil die Quelle zwei "020" -Muster enthält, auf die Ihr Regex-Muster passt. Versuchen Sie, Ihre Quelle zu ändern:

%Vor%

Jetzt wird es 02 in einer Reihe und Sie werden diesmal vier.

    
DelegateX 13.08.2012 22:21
quelle

Tags und Links