Wann sollten Rückverfolgungssteuerelemente wie (* PRUNE) verwendet werden?

8

Einige Regex-Engines (nun, soweit ich weiß, nur Perl) unterstützen die Backtracking-Verben: (*PRUNE) , (*SKIP) , (?{doSomeCode();}) * usw. Ich weiß schon, was diese Verben tun , von hier .

Ich habe nur ein sehr grundlegendes Verständnis von Perl (also sollte man sich, wenn möglich, nicht auf komplizierten Perl-Code verlassen), aber ich weiß, dass es als die Sprache bekannt ist, die neue Regex-Funktionen vorantreibt.

Nach meinem Verständnis scheint Perl mit Regexen besser integriert zu sein als jede andere Sprache. Aus diesem Grund könnte es Sinn machen, dass sein imperativer Stil in seine Regexen eindringt. In anderen Sprachen, die Regexes haben, selbst wenn die gierige Bewertung priorisiert ist, ist der zugrundeliegende Stil der Regexes deklarativ (ähnlich wie bei SQL).

Ich bin geneigt zu denken, dass diese Verben etwas esoterisch sind, oder zumindest ein unnötiger Schritt zu einer niedrigeren Art von Programmierung. Anstatt eine (* PRUNE) zu benötigen, wäre es nicht besser (die Komplexität für Regex-Writer / Programmierer und Leser zu reduzieren), mehr Optimierungen hinter den Kulissen zu haben (wie im Compiler oder in der Engine)?

Also, in welcher Situation ist es sinnvoll, ein Backtracking-bezogenes Verb in eine Regex zu integrieren, in der Praxis? Gibt es jemals einen Vorteil, dies zu tun?

* Obwohl es sich technisch gesehen nicht um ein Backtracking-Kontrollverb handelt, führen viele Beispiele, die willkürlichen Code in Regexes ausführen, dies auf eine Weise aus, die das Backtracking beeinflusst oder davon betroffen ist.

Hintergrund

Laut dem Perl-Regex-Lernprogramm sind diese Funktionen experimentell (und können in Zukunft entfernt werden). Es ist kein Wunder, dass ich nicht viel über diese Konstrukte im Internet finden kann (besonders wenn die Suche mit irrelevanten Ergebnissen, die skip oder prune außerhalb des Codes haben, verstopft ist). Ich wette, dass es viele Leute gibt, die in Regex weit genug fortgeschritten sind, um diese Verben zu benutzen, die einfach nicht über sie wissen.

Daher gibt es derzeit eine Reihe von praktischen Hindernissen, die einer breiten Nutzung vorbeugen:

  1. Features sind experimentell

  2. Features sind unklar

  3. Die Funktionen sind erweitert

Die obigen 3 Punkte sind offensichtlich, also möchte ich, dass die Antworten mehr als it's never useful because: 1, 2, or 3 ergeben. Versuchen Sie, wenn möglich, einige Hintergrundinformationen darüber zu geben, was die Autoren für diese Verben beabsichtigt haben, und / oder Beweise, dass sie tatsächlich verschrottet werden (oder eine andere Zukunft für sie geplant ist).

Ich bin mir auch bewusst, dass geschlossene (zu meinungsbezogene) Frage existiert, aber ich glaube nicht, dass diese Frage zu sehr auf Meinungen basiert. Ich glaube, die andere Frage war meinungsbezogen, weil sie fragte "Have you ", was bedeutet, dass die Antwort von Person zu Person variieren muss (ich hätte eine Antwort schreiben können, um zu sagen: "Nein, habe ich nicht") ohne dass es falsch wäre, aber es wäre auch nicht hilfreich). Ich werde sagen, dass die einzige Antwort, um "Ja" zu dieser Frage zu sagen, zwei Verbindungen gab, von denen eine esoterische Verwendung war (zusätzlich kann ich es nicht verstehen ...). Die andere, obwohl es eine Situation gegeben hat, wann (*FAIL) verwendet werden sollte, hat keines der anderen erwähnten Konstrukte angesprochen und auch (*FAIL) nicht als Backtracking-Mechanismus verwendet. Soweit ich weiß, kann (*FAIL) von einer Regex emuliert werden das scheitert immer .

Lassen Sie mich neu festlegen, wonach ich in einer Antwort suche:

  • Bezieht sich speziell auf Backtracking
  • Nicht-esoterisch
  • Praktisch
  • Mehr als ein Anwendungsbeispiel
  • Hat eine Erklärung für gegebene Beispiele
  • Kann Hintergrundinformationen zum Hinzufügen von Features enthalten
  • Kann Aktualisierungen mit Quellen enthalten, die für die Zukunft der Features relevant sind (in Perl oder anderen Regex-Varianten)
Laurel 23.03.2016, 16:50
quelle

2 Antworten

1

Eine gute Dokumentation, die Sie sich ansehen können, ist der Abschnitt über Anweisungen in Parse :: RecDescent . Insbesondere die <commit> -Direktive scheint mit (*PRUNE) verwandt zu sein (obwohl es auch (*COMMIT) gibt) und enthält ein aufschlussreiches Beispiel.

Mein persönlicher Eindruck ist, dass sie Ihnen in den meisten Fällen Werkzeuge zur Verfügung stellen, um Ihre Regexes besser zu machen (z. B. leistungsfähiger oder klarer), aber nicht unbedingt effektiver. Als ein Beispiel können Sie wahrscheinlich ohne (*PRUNE) leben, aber Sie würden unter stärkerem Backtracking leiden und wie sich das auf Sie auswirkt, hängt davon ab, was Sie versuchen zu erreichen. Re (*FAIL) , es könnte wahrscheinlich mit einem nicht passenden Unter-Regex emuliert werden, aber es ist viel klarer, was die Absicht ist, dass es zumindest die Lesbarkeit verbessert.

    
polettix 16.04.2016 00:43
quelle
0

Kurz gesagt: Sie werden wissen, ob Sie sie brauchen, und wenn Sie nicht sicher sind, nicht.

Wie andere schon angedeutet haben, handelt es sich meist um leistungsbasierte Optimierungswerkzeuge, die für die grammatische Verarbeitung geeignet sind. Nicht nur ist die vorzeitige Optimierung die Wurzel allen Übels, diese Merkmale wurden bis vor kurzem als experimentell markiert. Daher könnte man vernünftigerweise schlussfolgern, dass sie für die meisten Anwendungsfälle nicht notwendig sind und dass es am besten ist, keine Probleme / Komplexität zu übernehmen, es sei denn, dies ist notwendig.

    
belg4mit 05.07.2016 16:36
quelle

Tags und Links