2008-08-27 11 views
9

Ich habe eine Menge von Gemeinsamkeiten in regex Fähigkeiten verschiedener regex-fähigen Tool/Sprachen (zum Beispiel Perl, Sed, java, vim, etc.) gesehen, aber ich habe auch viele Unterschiede.Features, die allen Regex-Varianten gemeinsam sind?

Gibt es eine Standard Teilmenge von Regex-Funktionen, die alle Regex-fähigen Tools/Sprachen unterstützen? Wie unterscheiden sich Regex-Funktionen zwischen Tools/Sprachen?

Antwort

1

Wenn Sie die grep regexp Grammatik nahm, nicht die egrep eine oder die sed regexp Grammatik und verwendet, dass Sie sollten eine sichere Teilmenge für viele Plattformen und Tools verwenden.

Über die einzige Sache, die Sie dann beißen können, ist wenn Sie zwischen Regexp-Implementierungen mit Finite-State-Automaten (FSA) und denen mit Backtracking, z. Quantifier-Implementierungen variieren von grep zu Perl.

FSA-basierte Implementierungen finden die längste Übereinstimmung ab der ersten möglichen Position. Backtracking-Spieler finden das linksbündige erste Match, beginnend bei der ersten möglichen Position. Das heißt, es wird jede Verzweigung in der Reihenfolge in dem Muster versuchen, bis eine Übereinstimmung gefunden wird.

Betrachten Sie die Zeichenfolge "xyxyxyzz" und das Muster "(xy)*(xyz)?". FSA-basierte Engines stimmen mit dem längsten möglichen Teilstring überein, "xyxyxyz". Backtracking-basierte Engines stimmen mit dem linksbündigen ersten Teilstring "xyxyxy" überein.

+0

"nicht endliche Entscheidungsautomaten". Mein Computer hat nur endlichen Speicher; Wie hält es ein unendliches $ THING? Ich denke, du könntest s/endlich/deterministisch/g bedeuten. –

1

Die meisten regulären Ausdruck Tools/Sprachen unterstützen diese basic capabilities:

  1. Charakterklassen/Sets und ihre Negation - []
  2. Anker -^$
  3. Makeln - |
  4. Quantifizierer -? * + {N, m}
  5. Metazeichen - \ w, \ s \ d, ...
  6. Rückverweise - \ 1 \ 2, ...
  7. Dot -.
  8. Einfache Modifikatoren wie/g und/i für die globale und ignorieren Fall
  9. Escaping Charaktere

Fortgeschrittenere Tools/Sprachen unterstützen:

  1. Lookaheads und behinds
  2. POSIX Zeichenklassen
  3. Wortgrenzen
  4. Inline-Schalter wie Gehäuse zulassen nsitivity nur für einen kleinen Teil der Regex
  5. Modifikatoren wie/x zusätzliche Formatierung und Kommentare zu ermöglichen,/m für mehrzeilige
  6. Benannte Captures
  7. Unicode
+2

Einige einfache Implementierungen (z. B. in Scintilla/SciTE) unterstützt nicht einmal Alternierung oder einige Quantifizierer (? Und {}). – PhiLho

0

Es gibt keinen Standard-Motor. Das POSIX Extended Regular Expression-Format ist jedoch eine gültige Teilmenge der meisten Engines und ist wahrscheinlich so ähnlich wie eine standardisierte Teilmenge.

0

Siehe Emacs regulären Ausdruck Syntax: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

Ich erinnere mich zu lesen, dass Emacs-Syntax in Stein gemeißelt ist (aus Gründen der Rückwärtskompatibilität), also wenn Sie mit alles kompatibel sein wollen, machen Sie alles kompatibel damit. Einige Tools unterstützen dies, andere nicht.

Während Sie ein lohnendes Ziel haben, denke ich, dass es sehr schwer zu erreichen sein wird, und ich habe auch festgestellt, dass Emacs 'RegExps ein Schmerz ist, mit dem man arbeiten kann. Vielleicht 99% von allem ist gut genug, wenn es dich glücklicher und produktiver macht?

Verwandte Themen