Reg-Ex für gerade Anzahl von 0EN und 1en
Ich versuche, erstellen Sie einen regulären Ausdruck, der bestimmt, ob eine Zeichenfolge (jeder Länge) entspricht einem regex-Muster so, dass die Anzahl der 0EN in der Zeichenkette ist, selbst, und die Anzahl der 1en in der Zeichenfolge selbst. Kann mir jemand helfen, festzustellen, eine regex-Anweisung, die ich versuchen könnte, und überprüfen Sie die Zeichenfolge, die für dieses Muster?
- Was haben Sie versucht?
- gibt es irgendein limit, wie lange die Zeichenfolge (mit der binäre) sein könnte? wie viele bits?
- Es gibt keine Begrenzung (außer für das, was der string-Zeichen-Grenze ist offensichtlich). 🙁
- Sorry, ich verpasste Ihre erste post. Ich habe versucht, brechen Sie die Optionen unten, um wiederholbare 2,4,8 Charakter Abschnitten, haben aber versäumt, etwas zu finden, ist in der Lage, alle verfügbaren Optionen.
- Warum müssen Sie regex verwenden? Es wäre einfacher, a) Ersetzen Sie alle diejenigen, die mit Leerzeichen/null-strings b) Erhalten Länge string/Zahl- > "L" c) Prüfen, ob L gerade ist.
- hat die pumping-lemma-Arbeit? Nehmen Sie
p = 4
, undy
zu sein, das erste vorkommen von11
oder00
(oder wenn das nicht auftreten, in den ersten 4 Zeichen:1010
oder0101
), dann erfüllt er die Bedingung des pumping lemma (soweit ich das verstanden habe), und der Beweis durch Widerspruch misslingt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also völlig neu formuliert, meine Antwort zu spiegeln alle die änderungen:
Dieser regex entsprechen würden alle Zeichenfolgen, die nur mit Nullen und Einsen und nur gleiche Mengen dieser
Sehen es hier auf Regexr
Arbeite ich hier mit positive lookahead-assertions. Der große Vorteil ist hier eine lookahead-assertion, dass es prüft die komplette Zeichenfolge, aber ohne die passende it, um die beiden lookaheads beginnen, überprüfen Sie die Schnur von Anfang an, aber für unterschiedliche Aussagen.
(?=1*(?:01*01*)*$)
überprüft, einen gleichen Betrag von 0 (einschließlich 0)(?=0*(?:10*10*)*$)
überprüft, für eine gleiche Menge von 1 (einschließlich 0).*
hat dann eigentlich mit der ZeichenfolgeDiese lookaheads überprüft:
11
oder1111
, aber es funktioniert... Gut gemacht! 😉+
in der "look ahead" zu*
zu vermeiden, mit den|
und noch akzeptieren11
etc?$
es halt nur anpassen das leere Zeichenfolge (es sei denn, der string ist leer)?(?=(?:[^0\s]*0[^0\s]*0[^0\s]*)*$)
den äußeren*
ist gleich null, Sie effektiv haben(?=$)
das bedeutet, dass die Behauptung wahr ist, wenn nach dem start der Zeichenkette (wegen der^
am start) folgt$
, so seine true, wenn der string leer ist.+
zu*
im look-aheads (Vermeidung der|
) und ändern Sie die (nicht-lookahead)[01]*
zu[01]+
. (Also, es ist nicht einmal klar, dass der leere string sollte scheitern:""
enthält 01
s und 00
s, und 0 ist gerade.)0
und1
sowieso (über den Teil der regex, der tatsächlich verbraucht die passenden Zeichen, nämlich die^[01]*$
Teil, dann brauchen Sie nicht alle diese[^0\s]*
und[^1\s]*
-1*
und0*
wird genauso gut funktionieren.Auch für Gruppen von 0s, können Sie mit der folgenden regex, um sicherzustellen, dass die Anzahl der 0EN gerade ist.
Aber ich glaube, dass die Frage ist, haben beide eine gerade Anzahl von 0EN und auch eine gerade Anzahl von 1en. Da es möglich ist, konstruieren Sie einen nichtdeterministischen endlichen Automaten (NFA) für dieses problem, die Lösung ist eine regelmäßige und dargestellt werden kann, mit einem regex-Ausdruck. Die NFA ist vertreten über die Maschine unten ist S1 der start - /exit-Zustand.
Von dort, es gibt einen Weg, um zu konvertieren NFAs zu regex-Ausdrücke, aber es ist schon eine Weile seit meiner Berechnung natürlich. Es gibt einige Hinweise unten, die scheinen hilfreich zu sein bei der Erklärung der Schritte zum umwandeln eines NFA zu einem regex.
http://www.cs.uiuc.edu/class/sp09/cs373/lectures/lect_08.pdf
^((1|0(11)*10)(00|0110)*(1|01(11)*0)|0(11)*0)*$
funktioniert. (Möglicherweise kann faktorisiert werden kleiner). regexr.com?30m8j10111101
, aber dies bedeutet:^((1|0(11)*10)(0(11)*0)*(1|01(11)*0)|0(11)*0)*$
So, ich habe endlich eine Lösung für das problem:
^(11|00|(10|01)(11|00)*(10|01))*$
im gemeinsamen regex flavors. Der trick hier ist zu erkennen, dass die Frage ist in der Tat äquivalent zu "geraden Anzahl vonA
s in einem string derA
s undB
s", woA
wird ergänzt durch10|01
undB
wird ergänzt durch11|00
.RE-AKTUALISIERT WERDEN,
Versuchen Sie dies : [ schauen Sie sich diese demo an : http://regexr.com?30m7c ]
Hinweis :die geraden zahlen sind durch 2 teilbar, also - in Binär - Sie enden immer in null (0
)Nicht einen regulären Ausdruck (was wahrscheinlich unmöglich ist, kann ich zwar nicht beweisen es: der Beweis durch Widerspruch über das pumping-lemma ausfällt), aber der "richtige" Lösung ist die Vermeidung einer komplizierten und ineffizienten regulären Ausdruck alle zusammen, und etwas wie (in Python):
Oder wenn der string bestehen nur aus
1
s und0
s:Wenn ich nicht etwas übersehen, dies entspricht einem beliebigen bit-string, wo die Anzahl der 0EN ist auch und die Anzahl der 1en gerade ist, mit nur rudimentäre regex-Operatoren (
*
,^
,$
). Es ist etwas einfacher, um zu sehen, wie es funktioniert, wenn wie folgt geschrieben:Den folgenden test-code soll dies verdeutlichen die Richtigkeit - wir vergleichen das Ergebnis der pattern-match gegen eine Funktion, die uns sagt, ob ein string eine gerade Anzahl von 0EN und 1en. Alle bit-strings der Länge 16 getestet.
Wenn Sie versuchen, Sie zu lösen innerhalb den gleichen Satz (beginnend mit ^ und endend mit $), Sie sind in der tiefen Mühe. 🙂
Können Sie sicherstellen, dass Sie eine gerade Anzahl von 0EN (mit
^(1*01*01*)*$
, wie bereits von @david-z) ODER können Sie sicherstellen, dass Sie eine gerade Anzahl von 1en:Es Werke für Streicher mit kleinen Längen, als auch, wie "00" oder "101", gültige Zeichenfolgen.
Habe ich auch gearbeitet lookaheads und lookbacks in meiner Freizeit, und mit lookahead-das problem kann gelöst werden, während der Einnahme auch der Grund für die Einzel-1s und/oder das Einzel-0s. So soll der Ausdruck auch für 11,1111,111111,... und auch für 00,0000,000000,....
Funktioniert für alle Fälle.
Also, wenn der string besteht nur aus 1en oder nur 0EN:
Wenn es enthält eine Mischung von 0s und 1s, die positive lookahead wird sich darum kümmern.
Kombination der beiden von Ihnen, es berücksichtigt alle Zeichenfolge mit einer geraden Anzahl von 0s und 1s.