Reg Ex für gerade Anzahl von 0s und 1s

7

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?

    
canton 18.04.2012, 07:13
quelle

7 Antworten

4

Also, ich habe eine Lösung für das Problem gefunden:

%Vor%     
canton 26.04.2012, 17:26
quelle
8

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. (?=1*(?:01*01*)*$) prüft die gleiche Anzahl von 0 (einschließlich 0)

  2. (?=0*(?:10*10*)*$) sucht nach einer gleichen Menge von 1 (einschließlich 0)

  3. .* entspricht dann tatsächlich der Zeichenfolge

Diese Lookaheads überprüfen:

%Vor%     
stema 18.04.2012 07:39
quelle
4

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.

Ссылка

    
David Z. 18.04.2012 07:40
quelle
1

NEU AKTUALISIERT

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 )

    
Dr.Kameleon 18.04.2012 07:18
quelle
1

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:

%Vor%     
huon 18.04.2012 07:56
quelle
1
%Vor%

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:

%Vor%

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%     
Sean Kelleher 09.05.2014 18:47
quelle
0

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:

%Vor%

Dies funktioniert auch für Strings mit kleinen Längen, wie zB "00" oder "101", beides gültige Strings.

    
eduellery 31.08.2013 23:01
quelle

Tags und Links