462 Stimmen

Welche Sonderzeichen müssen in regulären Ausdrücken escaped werden?

Ich bin es leid, immer zu raten, ob ich Sonderzeichen wie ' ()[]{}| ' usw., wenn viele Implementierungen von Regexps verwendet werden.

Anders verhält es sich zum Beispiel mit Python, sed, grep, awk, Perl, rename, Apache, find und so weiter. Gibt es eine Regel, die mir sagt, wann ich Sonderzeichen auslassen sollte und wann nicht? Hängt das vom Regexp-Typ ab, wie PCRE, POSIX oder erweiterte Regexps?

5 Stimmen

Gute Regex-Bibliotheken haben Funktionen wie " escape() ", um die Verwendung beliebiger Zeichenketten als Regex-Teile zu ermöglichen.

2 Stimmen

Sie können Online-Regex-Ausdrucksprüfungen verwenden wie gskinner.com/RegExr (es ist kostenlos). (Tippen Sie ein und fahren Sie dann mit der Maus über die eingegebene Regex)

0 Stimmen

In PHP können Sie verwenden php.net/preg_quote

424voto

Jan Goyvaerts Punkte 20683

Welche Zeichen Sie auslassen müssen und welche Sie nicht auslassen dürfen, hängt in der Tat von der Regex-Variante ab, mit der Sie arbeiten.

Bei PCRE und den meisten anderen sogenannten Perl-kompatiblen Flavors werden diese außerhalb der Zeichenklassen entschlüsselt:

.^$*+?()[{\|

und diese innerhalb der Zeichenklassen:

^-]\

Bei erweiterten POSIX-Regexen (ERE) sind diese außerhalb der Zeichenklassen zu entschlüsseln (wie bei PCRE):

.^$*+?()[{\|

Das Escapen anderer Zeichen ist ein Fehler mit POSIX ERE.

Innerhalb von Zeichenklassen ist der Backslash ein literales Zeichen in regulären POSIX-Ausdrücken. Sie können ihn nicht verwenden, um etwas zu entkommen. Sie müssen ihn "geschickt platzieren", wenn Sie Metazeichen der Zeichenklasse als Literale einschließen wollen. Setzen Sie das ^ an beliebiger Stelle außer am Anfang, das ] am Anfang und das - am Anfang oder Ende der Zeichenklasse ein, um diese wörtlich zu übernehmen, z.B.:

[]^-]

In den grundlegenden regulären Ausdrücken von POSIX (BRE) sind dies Metazeichen, die Sie mit einem Escape-Zeichen versehen müssen, um ihre Bedeutung zu unterdrücken:

.^$*[\

Das Ausklammern von Klammern und geschweiften Klammern in BREs verleiht ihnen die besondere Bedeutung, die ihre nicht ausgeklammerten Versionen in EREs haben. Einige Implementierungen (z.B. GNU) geben auch anderen Zeichen eine besondere Bedeutung, wenn sie escaped werden, wie z.B. \? und +. Das Escapen eines anderen Zeichens als .^$*(){} ist normalerweise ein Fehler bei BREs.

Innerhalb von Zeichenklassen gelten für BREs die gleichen Regeln wie für EREs.

Wenn Ihnen das alles zu Kopf steigt, sollten Sie sich ein Exemplar von RegexBuddy . Auf der Registerkarte Erstellen klicken Sie auf Token einfügen und dann auf Literal. RegexBuddy fügt bei Bedarf Escapezeichen hinzu.

82voto

Beejor Punkte 7262

Moderne RegEx-Varianten (PCRE)

Enthält C, C++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby, TCL, VB.Net, VBScript, wxWidgets, XML Schema, Xojo, XRegExp.
PCRE-Kompatibilität kann variieren

    Irgendwo: . ^ $ * + - ? ( ) [ ] { } \ |


Ältere RegEx-Aromen (BRE/ERE)

Enthält awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.
Die PCRE-Unterstützung kann in späteren Versionen oder durch die Verwendung von Erweiterungen aktiviert werden

ERE/awk/egrep/emacs

    Außerhalb einer Charakterklasse: . ^ $ * + ? ( ) [ { } \ |
    Innerhalb einer Zeichenklasse: ^ - [ ]

BRE/ed/grep/sed

    Außerhalb einer Charakterklasse: . ^ $ * [ \
    Innerhalb einer Zeichenklasse: ^ - [ ]
    Bei Literalen nicht ausbrechen: + ? ( ) { } |
    Für Standard-Regex-Verhalten, Escape: \+ \? \( \) \{ \} \|


Notas

  • Wenn Sie sich bei einem bestimmten Zeichen nicht sicher sind, können Sie es wie folgt auslassen \xFF
  • Alphanumerische Zeichen können nicht durch einen Backslash ersetzt werden
  • Beliebige Symbole können in PCRE mit einem Backslash escaped werden, aber nicht in BRE/ERE (sie müssen nur escaped werden, wenn sie benötigt werden). Für PCRE ] - müssen nur innerhalb einer Zeichenklasse escapet werden, aber der Einfachheit halber habe ich sie in einer einzigen Liste zusammengefasst
  • Bei in Anführungszeichen gesetzten Ausdrücken müssen auch die sie umgebenden Anführungszeichen maskiert werden, und zwar oft mit verdoppelten Backslashes (wie "(\")(/)(\\.)" gegen /(")(\/)(\.)/ in JavaScript)
  • Abgesehen von Escapes können verschiedene Regex-Implementierungen unterschiedliche Modifikatoren, Zeichenklassen, Anker, Quantifizierer und andere Merkmale unterstützen. Weitere Einzelheiten finden Sie unter reguläre-ausdrücke.info , oder verwenden Sie regex101.de um Ihre Ausdrücke live zu testen

23voto

Dillie-O Punkte 28749

Leider gibt es keine festen Escape-Codes, da sie je nach verwendeter Sprache variieren.

Die Beibehaltung einer Seite wie der Tools für reguläre Ausdrücke Seite oder dies Cheatsheet für reguläre Ausdrücke kann Ihnen sehr dabei helfen, Dinge schnell herauszufiltern.

7voto

Jonathan Leffler Punkte 694013

POSIX kennt mehrere Varianten von regulären Ausdrücken - einfache reguläre Ausdrücke (BRE) und erweiterte reguläre Ausdrücke (ERE). Und selbst dann gibt es Macken aufgrund der historischen Implementierungen der von POSIX standardisierten Dienstprogramme.

Es gibt keine einfache Regel dafür, wann welche Notation zu verwenden ist, oder sogar welche Notation ein bestimmter Befehl verwendet.

Lesen Sie Jeff Friedl's Reguläre Ausdrücke beherrschen Buch.

5voto

Darron Punkte 20861

Leider ist die Bedeutung von Dingen wie ( und \( zwischen regulären Ausdrücken im Emacs-Stil und den meisten anderen Stilen vertauscht. Wenn Sie also versuchen, diese Ausdrücke zu umgehen, tun Sie möglicherweise das Gegenteil von dem, was Sie wollen.

Man muss also wirklich wissen, welchen Stil man zu zitieren versucht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X