Diese Antwort erklärt die theoretische Einschränkung, warum reguläre Ausdrücke nicht das richtige Werkzeug für diese Aufgabe sind.
Reguläre Ausdrücke können dies nicht tun.
Reguläre Ausdrücke basieren auf einem Berechnungsmodell, das als Finite State Automata (FSA)
. Wie der Name schon sagt, ist ein FSA
kann sich nur an den aktuellen Zustand erinnern, er hat keine Informationen über die vorherigen Zustände.
![FSA]()
In dem obigen Diagramm sind S1 und S2 zwei Zustände, wobei S1 der Anfangs- und Endschritt ist. Wenn wir also mit der Zeichenfolge 0110
verläuft der Übergang wie folgt:
0 1 1 0
-> S1 -> S2 -> S2 -> S2 ->S1
In den oben genannten Schritten, wenn wir bei der zweiten S2
d.h. nach dem Parsen 01
de 0110
hat die FSA keine Informationen über den früheren 0
en 01
da es sich nur den aktuellen Zustand und das nächste Eingabesymbol merken kann.
In der obigen Aufgabe müssen wir die Anzahl der öffnenden Klammern kennen, d.h. sie muss sein gespeichert an einem bestimmten Ort. Aber da FSAs
kann das nicht, ein regulärer Ausdruck kann nicht geschrieben werden.
Es kann jedoch ein Algorithmus geschrieben werden, der diese Aufgabe übernimmt. Algorithmen fallen im Allgemeinen unter Pushdown Automata (PDA)
. PDA
ist eine Ebene über FSA
. PDA hat einen zusätzlichen Stapel, um einige zusätzliche Informationen zu speichern. PDAs können verwendet werden, um das oben genannte Problem zu lösen, denn wir können ' push
' die öffnende Klammer im Stapel und ' pop
', sobald wir auf eine schließende Klammer stoßen. Wenn der Stapel am Ende leer ist, dann stimmen öffnende und schließende Klammer überein. Andernfalls nicht.
7 Stimmen
Diese Frage ist sehr schlecht, weil nicht klar ist, worum es geht. Alle Antworten haben sie unterschiedlich interpretiert. @DaveF können Sie bitte die Frage klären?
2 Stimmen
In diesem Beitrag wird geantwortet: stackoverflow.com/questions/6331065/