Frage

Mehrere Implementierungen regulärer Ausdrücke unterscheiden sich in subtiler Weise voneinander, was die Quelle vieler Verwirrung ist, wenn ich versuche, sie zu verwenden.

Die meisten dieser Unterschiede umfassen die Semantik, die sich darauf bezieht, ob ein Charakter entkommen ist oder nicht. Dies ist am häufigsten ein Problem mit Klammern, kann sich aber für lockige Klammern und andere anwenden. Dies ist wahrscheinlich eine Folge der Syntax der Sprache oder Umgebung, in der die Implementierung gefunden wird. Zum Beispiel, wenn die $ Das Symbol zeigt einen variablen Namen in einer Sprache an. Man kann in dieser Sprache regelmäßige Ausdrücke erwarten, dass die Sprache den Anker "Ende der Zeile" entkommen muss \$ oder ein solches. Aber was zu diesem Zeitpunkt verwirrend wird, ist, wie Sie ein tatsächliches Dollarschild darstellen würden. Ich glaube, Perl versteht sich damit, indem er einen Regex in die Stürmerschnitzer einwickelt /.

In ähnlicher Weise gibt es Flucht für bestimmte Zeichen selbst, beispielsweise nicht Druckcharaktere wie z. \n und \t. Dann gibt es die ähnlich aussehenden generischen Zeichengruppen wie z. \d für Ziffern, \s für Whitespace und \w Was ich gerade gelernt habe, deckt sowohl Unterstriche als auch Ziffern ab. Ich fand mich mehrmals versuchte zu verwenden \a Für eine "alphabetische" Gruppe, die jedoch nur zum Bell -Charakter 0x07 passte.

Es ist ziemlich klar, dass es keine einfache und One-Shot-Lösung gibt, um alle Unterschiede in den Merkmalen und die Syntax zu kennen, die durch die unzähligen Implementierungen regelmäßiger Ausdrücke angeboten werden, kurz als jemand, der all die harte Arbeit erledigt und Ergebnisse in eine gut organisierte Ergebnisse legt Tisch. Hier ist ein Beispiel dafür genau dies, aber natürlich umfasst es nicht einige der Programme, die ich ausgiebig selbst verwende, einschließlich vim, sed, Notepad ++, Eclipse und glauben, dass es oder nicht.

Ich denke, was ich möchte, ist so faul wie möglich (in gewissem Sinne), indem ich versuche, eine Möglichkeit zu finden, für eine bestimmte Regex -Implementierung zu bestimmen, welche "Fluchteinstellungen" zweifelsfrei sind, indem sie einen (oder einige wenige) anwenden (oder einige ) Abfragen.

Ich denke, ich kann eine Datei erstellen, die Testfälle zusammen mit einer riesigen Regex -Abfrage enthält, und sie irgendwie konstruieren, so dass es mir genau zeigt, welche Syntax ich anschließend verwenden muss, ohne mich weiter zu bezweifeln. (Im Gegensatz dazu müssen Dateien bearbeiten und mehrere Abfragen verwenden, um dasselbe herauszufinden, das nach einer Weile furchtbar alt wird).

Wenn niemand anderes versucht hat, eine solche Monstrosität zu konstruieren, kann ich diese Aufgabe selbst übernehmen. Wenn es überhaupt möglich ist. Ist das möglich?

Ich habe versucht, ein Beispiel zu finden (es war nur um herauszufinden, ob der EOL -Anker ist $ oder \$) Aber in jedem Fall musste ich eine Vielzahl verschiedener Such-/Ersetzen von Abfragen verwenden, um festzustellen, wie das Programm auf die Eingabe reagiert.

EDIT: Ich habe etwas ausgedacht, das erfasst und zurückverfolgt hat. Ich muss ein bisschen mehr daran arbeiten.

UPDATE: Nun, Notepad ++ implementiert nicht den oder Bediener, der üblicherweise von der Rohr bezeichnet wird |. Words "Wildcards" ist auch ein schlechter Ersatz, das hat nicht | oder *. Ich bin mir ziemlich sicher, dass ein der regulären Ausdrucksbetreiber (Union, Concat, Star) das Fehlen einer regulären Grammatik nicht erzeugen kann, daher sind diese beiden ausgeschlossen.

Ich kann eine solche Eingabedatei erstellen:

$
*
]
EOL

und Abfrage

(\$)|(\*)|(\[)|($)

ersetzen durch

escDollar:\1:escStar:\2:escSQBrL:\3:Dollar:\4:

ergibt ein Ergebnis von (unter der Annahme, dass unabgeordnete Parens gruppieren und ein nicht entsandtes Rohr ist oder)

escDollar:$:escStar::escSQBrL::Dollar::
escDollar::escStar:*:escSQBrL::Dollar::
]escDollar::escStar::escSQBrL::Dollar::
EOLescDollar::escStar::escSQBrL::Dollar::

Ich habe das eingeführt vim. Diese Ausgabe würde die einzelnen Zeichen demonstrieren, die von jedem daraus angegebenen Element übereinstimmen, dh der entkommene Dollar -Schild -Element entspricht eher dem tatsächlichen Dollar -Zeichenzeichen als dem nicht entkommenen Dollar -Schild -Element am Ende.

Es ist schwer zu sehen, was mit dem los ist $ Anker Da es mit Null -Charakteren übereinstimmt, sollte es nicht schwierig sein, eine Lösung dafür zu finden. Außerdem ist es nicht üblicherweise falsch. Diejenigen, über die ich mir besonders Sorgen mache, sind Pipe und Parens und die verschiedenen Klammern. Wenn Sie 4 verschiedene Typen drin haben, gibt es 2^4 Kombinationen von entkommenen und nicht gelassenen Versionen, die Sie verwenden können. Trial-and-Irrtum damit ist schrecklich.

Diese Ausgabe ist nicht allzu schwer, um einen Blick zu analysieren, und ist auch als Teil eines Skripts ernsthaft einfach zu verarbeiten. Das einzige kriegende Problem, das übrig bleibt, besteht darin, herauszufinden, ob Parens und Rohr entkommen müssen. Weil die Funktionalität des Ganzen von ihnen abhängt.

Es scheint, als würde das mehrere Fragen erfordern. Es kann mit einem geschickt konstruierten Durcheinander von Backslashes, Parens und Rohren möglich sein, um die Kombination (nur 4 Möglichkeiten) mit einer ersten Abfrage herauszufinden, und wählen Sie dann die darauf nachfolgende Matrixgenerator -Abfrage basierend.

So etwas zeigt, dass es funktionieren kann:

(e)
(f)

Abfrage

\((f\))|\|\((e\))

ersetzen mit

\1:\2

würde produzieren:

  • :(e Wenn es entkommene Parens ist, ist Gruppen und entkommenes Rohr oder ist oder
  • :e) Wenn Parens Gruppen und entkommenes Rohr ist oder ist oder
  • (f: Wenn es entkommene Parens ist, gruppe und Pfeife ist oder
  • f): Wenn Parens Gruppen und Rohr ist oder

Ich mag das immer noch nicht wirklich, weil es eine zweite Abfrage bei einem zweiten Eingangssatz erfordert. Zu viel Einrichten. Ich kann nur 4 Kopien der "Matrix" -Ding machen.

War es hilfreich?

Lösung

Die Tabelle auf dieser Seite fasst ganz gut zusammen, welche Funktionen verfügbar sind, in welchen Regex -Implementierungen:

http://www.regular-expressions.info/refflavors.html

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