Ich versuche, einen regulären Ausdruck zu erstellen, der bestimmt, ob eine Zeichenfolge (beliebiger Länge) mit einem Regex-Muster übereinstimmt, so dass die Anzahl der 0 in der Zeichenfolge gerade und die Anzahl der 1 in der Zeichenfolge gerade ist. Kann mir jemand helfen, eine Regex-Anweisung zu bestimmen, die ich verwenden könnte, um die Zeichenfolge für dieses Muster zu überprüfen?
Meine Antwort wurde komplett neu formuliert, um alle Änderungen widerzuspiegeln:
Diese Regex würde alle Zeichenfolgen mit nur Nullen und Einsen und nur gleichen Mengen von denen
übereinstimmen %Vor%Siehe hier auf Regexr
Ich arbeite hier mit positiven Lookahead-Behauptungen . Der große Vorteil einer Lookahead-Assertion ist, dass sie die komplette Zeichenkette überprüft, aber nicht übereinstimmt, so dass beide Lookaheads beginnen, die Zeichenkette von Anfang an zu überprüfen, aber für verschiedene Assertions.
(?=1*(?:01*01*)*$)
prüft die gleiche Anzahl von 0 (einschließlich 0)
(?=0*(?:10*10*)*$)
sucht nach einer gleichen Menge von 1 (einschließlich 0)
.*
entspricht dann tatsächlich der Zeichenfolge
Diese Lookaheads überprüfen:
%Vor%Für gerade Mengen von 0 können Sie die folgende Regex verwenden, um sicherzustellen, dass die Anzahl der 0 gerade ist.
%Vor%Ich glaube jedoch, dass die Frage darin besteht, sowohl eine gerade Anzahl von 0 als auch eine gerade Zahl von 1 zu haben. Da es möglich ist, einen nichtdeterministischen endlichen Automaten (NFA) für dieses Problem zu konstruieren, ist die Lösung regulär und kann durch einen Regex-Ausdruck dargestellt werden. Der NFA wird über die Maschine unten dargestellt, S1 ist der Start- / Ausgangszustand.
%Vor%Von dort aus gibt es eine Möglichkeit, NFAs in Regex-Ausdrücke umzuwandeln, aber es ist schon eine Weile her, seit ich meinen Computerkurs gemacht habe. Unten finden Sie einige Hinweise, die hilfreich sind, um die erforderlichen Schritte zum Konvertieren eines NFA in eine Regex zu erklären.
Versuchen Sie Folgendes: [Schauen Sie sich diese Demo an: Ссылка ]
%Vor% Hinweis:
Gerade Zahlen sind durch 2 teilbar, somit enden sie - binär - immer in Null ( 0
)
Kein regulärer Ausdruck (was wahrscheinlich unmöglich ist, obwohl ich es nicht beweisen kann: der Beweis des Widerspruchs über das Pumping-Lemma versagt), aber die "richtige" Lösung besteht darin, einen komplizierten und ineffizienten regulären Ausdruck zu vermeiden und benutze etwas wie (in Python):
%Vor% Oder wenn die Zeichenfolge nur aus 1
s und 0
s bestehen soll:
Wenn ich nichts übersehen habe, entspricht dies einer Bitfolge, in der die Anzahl der 0s gerade und die Anzahl der 1en gerade ist, wobei nur rudimentäre Regex-Operatoren verwendet werden ( *
, ^
, $
). Es ist etwas einfacher zu sehen, wie es funktioniert, wenn es so geschrieben wird:
Der folgende Testcode sollte die Korrektheit verdeutlichen: Wir vergleichen das Ergebnis der Musterübereinstimmung mit einer Funktion, die uns sagt, ob eine Zeichenfolge eine gerade Anzahl von 0 und 1 hat. Alle Bitstrings der Länge 16 werden getestet.
%Vor%Wenn Sie versuchen, innerhalb desselben Satzes zu lösen (beginnend mit ^ und endend mit $), sind Sie in großen Schwierigkeiten. : -)
Sie können sicherstellen, dass Sie eine gerade Anzahl von 0s haben (mit ^(1*01*01*)*$
, wie von @ david-z angegeben) ODER Sie können sicherstellen, dass Sie eine gerade Anzahl von 1s haben:
Dies funktioniert auch für Strings mit kleinen Längen, wie zB "00" oder "101", beides gültige Strings.
Tags und Links regex