non-greedy

___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ qstnhdr ___ Können Regexes, die Nicht-Reedy-Quantifier enthalten, umgeschrieben werden, um nur gierige zu verwenden? ___ qstntxt ___

Angenommen, ich habe eine Regex-Sprache, die Literale, positive und negative Zeichenklassen, geordnete Alternationen und die gierigen Quantoren %code% , %code% und %code% unterstützt. (Dies ist im Wesentlichen eine Teilmenge von PCRE ohne Rückreferenzen, Look-Around-Assertions oder einige der anderen schickeren Bits.) Erhöht das Hinzufügen der Nongreedy-Quantifikatoren %code% , %code% und %code% die Ausdruckskraft dieses Formalismus?

Anders ausgedrückt, kann ein Muster, das ein Nicht-Rezept enthält, in ein äquivalentes Muster T geschrieben werden, das keine Nicht-Rezept-Quantifizierer enthält?

Wenn diese Frage in der Literatur berücksichtigt wurde, würde ich mich über alle Hinweise freuen, die jemand zur Verfügung stellen kann. Ich konnte fast keine theoretische Arbeit über die Ausdruckskraft erweiterter Regex-Formalismen erbringen (abgesehen von den üblichen Dingen, wie Rückreferenzen Sie von regulären Sprachen zu kontextfreien Grammatiken bewegen).

    
___ tag123pcre ___ Perl Kompatible Reguläre Ausdrücke: Reguläre Ausdrücke, die denen von Perl ähneln, implementiert von der PCRE-Bibliothek, die sie anderen Programmen anbietet. Auch der Name der Bibliothek selbst. ___ answer6767358 ___

Wenn Sie "Regex" sagen, beziehen Sie sich auf mehrere Techniken - das ist nicht nur eine Frage der zugrundeliegenden Theorie. Bedenken Sie die Frage "Passt diese Zeichenfolge zu meiner gegebenen Regex?" Für eine solche Frage ist der Begriff "gierig" nur ein Implementierungsdetail - wenn Sie eine der üblichen (aber ineffizienten) Backtracking-Implementierungen verwenden, kann dies die Leistung beeinträchtigen, aber nicht die Ausgabe. Ähnlich verhält es sich mit der Frage "Enthält diese Zeichenfolge eine Übereinstimmung?" wird nicht von gierigen vs. nicht-gierigen Quantoren beeinflusst. Diese erste Art von Regex bezieht sich auf den abstrakten Begriff der Mengenzugehörigkeit: Definition der Sprache übereinstimmender Strings.

Warum gibt es überhaupt nicht-gierige Quantifier? Regexes werden nicht nur zum Matching verwendet; Übliche Implementierungen können finden, wobei die Übereinstimmung ist und welche Teile der Regex mit den Teilen der Ausgabe übereinstimmen. Auf diese Weise hängt ein Benutzer von den Feinheiten der Implementierung ab, was nicht trivial ist. Diese zweite Art von Regex befasst sich damit, einige Textstücke in eine praktischere Darstellung zu bringen, wobei der Kontext einer ansonsten turing-vollständigen Sprache verwendet wird.

Wenn Sie von der Stärke des regulären Ausdrucksformalismus sprechen, sprechen Sie im Allgemeinen von der ersten Welt - in der der Computer mit einem einfachen Ja oder Nein antwortet. Es ist einfach darüber zu reden, weil die Spezifikation klar ist. Wenn Sie von einem gierigen vs. nicht-gierigen Quantifizierer sprechen, sprechen Sie von der zweiten Welt, die in der Praxis verwendet wird, aber mit einer Spezifikation, die meist ohne große Planung zur Lösung realer Probleme entwickelt wurde und aufgrund der Abwärtskompatibilität ein Standard ist . Diese zweite Welt löst ganz andere Probleme, und mir ist nicht klar, was "Ausdruckskraft" hier überhaupt bedeuten soll. Gewiss, nicht-gierig kann praktisch sein; und das ist irgendwie der Punkt ...

Nicht-gierige Quantifier tun nichts für die erste Art der Ausdruckskraft, und sie tun es für die zweite, obwohl es nicht ganz klar ist, was "Ausdruckskraft" hier überhaupt bedeutet.

    
___ tag123nonfreedy ___ Eine in regulären Ausdrücken verwendete Methode, die den übereinstimmenden Text begrenzt, bis alle Bedingungen der angegebenen Regex erfüllt sind. Der Operator "?" wird an das Ende von Platzhalteroperationen hinzugefügt. ___ tag123theory ___ Programmiersprachen-agnostisch Fragen, die sich eher auf die theoretischen Aspekte als auf die eigentlichen Implementierungen konzentrieren. ___
2
Antworten

Kann ich mit dotall einen nicht-gierigen Regex haben?

Ich möchte dotall und nicht-gierig zusammenbringen. Das ist was ich habe: %Vor% Dies ist jedoch nicht nicht gierig. Diese Daten stimmen nicht wie erwartet überein: %Vor% und ich kann nicht verstehen warum. Was ich in der obigen Regel...
29.02.2012, 22:41
1
Antwort

Können Regexes, die Nicht-Reedy-Quantifier enthalten, umgeschrieben werden, um nur gierige zu verwenden?

Angenommen, ich habe eine Regex-Sprache, die Literale, positive und negative Zeichenklassen, geordnete Alternationen und die gierigen Quantoren ? , * und + unterstützt. (Dies ist im Wesentlichen eine Teilmenge von PCRE ohne Rückreferenze...
20.07.2011, 18:15