Frage

Wie der Name schon sagt wir vielleicht denken, dass reguläre Ausdrücke nur reguläre Sprachen mithalten können. Aber reguläre Ausdrücke wir in der Praxis verwenden enthalten Sachen, die ich bin nicht sicher, ob es möglich ist mit ihren theoretischen Pendants zu implementieren. Wie zum Beispiel würden Sie einen Rückverweis simulieren? So stellt sich die Frage: Was ist die theoretische Leistung der regulären Ausdrücke wir in der Praxis nutzen? Können Sie einen Weg finden {(a^n)(b^n)|n>=0} passen? Was ist {(a^n)(b^n)(c^n)|n>=0}?

War es hilfreich?

Lösung

Die Antwort auf Ihre Frage lautet: „regulärer Ausdruck“ Sprachen, mit denen Rückverweise weder regelmäßig sind noch kontextfrei. (Mit anderen Worten, wie Sie wies darauf hin, kann man nicht simulieren Rückverweis mit einer regulären Sprache, noch mit einer CFL). In der Tat, sagt Wikipedia viele der „regulärer Ausdruck“ Sprachen, die wir in der Praxis verwenden sind NP-Complete :

Musterabgleich mit unbeschränkter Zahl der Rückverweise, wie , Die von zahlreichen modernen Werkzeugen unterstützt wird NP-vollständig (siehe [11] Satz 6.2).

Wie bereits erwähnt wurde, werden die regulären Ausdruck Sprachen unterstützt häufig in Computersprachen und Bibliotheken sind ein anderes Tier von regulären Ausdrücken in der formalen Sprachtheorie. Larry Wall schrieb in Bezug auf Perl "reguläre Ausdrücke"

'Reguläre Ausdrücke' [...] sind nur geringfügig auf reale regelmäßig im Zusammenhang Ausdrücke. Dennoch wird der Begriff hat sich mit den Fähigkeiten unserer gewachsen Pattern-Matching-Engines, so dass ich nicht bin werde versuchen, linguistische zu kämpfen Notwendigkeit hier. Ich werde jedoch im Allgemeinen nennen sie „reguläre Ausdrücke“

Sie werden gefragt,

Können Sie sich ein Weg zum Spiel {(A ^ n) (b ^ n) | n> = 0}? Wie wäre es mit {(A ^ n) (b ^ n) (c ^ n) | n> = 0}?

Ich bin nicht sicher hier, wenn Sie Test sind versuchen, ob theoretische reguläre Ausdruck Sprachen können die „Sprache der Quadrate“ entsprechen, oder ob Sie suchen für eine Implementierung in einem (praktisch) regex Sprache. Hier ist der Beweis, warum die ehemaligen nicht möglich ist; und hier ist eine lange Erklärung und Umsetzung des letzteren für Java reguläre Ausdrücke.

Andere Tipps

Die grundlegende Schwierigkeit mit regulären Ausdrücken, dass Sie gerade Hinting ist die Tatsache, dass reguläre Ausdrücke nicht über ein „Gedächtnis“ zu ihnen. In der reinsten Form, kein wirklicher regulärer Ausdruck sollte eine dieser Sprachen erkennen kann. All reguläre Ausdruck, der diese Art von Sprachen analysieren könnte, wäre per Definition nicht regulär. Ich denke, was Sie meinen „reguläre Ausdrücke verwenden wir die Praxis“ ist erweitert reguläre Ausdrücke, die nicht technisch reguläre Ausdrücke.

Das Problem mit Ihrer Frage ist, dass Sie ein speziell erdacht theoretisches Szenario auf eine praktische Situation anzuwenden fragen, die fast immer in einer Katastrophe endet.

Also meine Antwort ist eine Art von Nicht-Antwort, dass ich sage, Sie die Frage anders formulieren müßten fragen über erweitert Reguläre Ausdrücke für sie eine Antwort haben.

Ein paar Ressourcen, dass Macht Hilfe in dieser Angelegenheit:

Hilfreiche Wikipedia-Artikel

ähnliche Frage Stackoverflow

Gutes Buch mit einem Kapitel zu diesem Thema

ich auch meine Antwort ein Community Wiki für alle anderen zu machen, die in diesem Gedankengang beitragen will.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top