Suche…


Raw String Literals

Es ist am besten für die Lesbarkeit (und Ihre Vernunft), um zu vermeiden, dass die Flucht entkommt. Hier kommen rohe Zeichenkettenliterale ins Spiel. (Beachten Sie, dass einige Sprachen Trennzeichen zulassen, die normalerweise gegenüber Zeichenketten bevorzugt werden. Dies ist jedoch ein anderer Abschnitt.)

Sie funktionieren normalerweise auf dieselbe Weise wie diese Antwort beschreibt :

[A] backslash, \ bedeutet "nur ein Backslash" (außer wenn es direkt vor einem Zitat steht, das sonst das Literal beenden würde) - keine "Escape-Sequenzen" zur Darstellung von Zeilenumbrüchen, Registerkarten, Backspaces, Formular-Feeds , und so weiter.

Nicht alle Sprachen haben sie und die, die unterschiedliche Syntax verwenden. C # nennt sie eigentlich wörtliche String-Literale , aber es ist dasselbe.


Python

pattern = r"regex"
pattern = r'regex'

C ++ (11+)

Die Syntax hier ist äußerst vielseitig. Die einzige Regel ist die Verwendung eines Trennzeichens, das an keiner Stelle im regulären Ausdruck erscheint. Wenn Sie dies tun, ist für etwas in der Zeichenfolge kein zusätzliches Escape erforderlich. Beachten Sie, dass die Klammern () nicht Teil der Regex sind:

pattern = R"delimiter(regex)delimiter";

VB.NET

Verwenden Sie einfach eine normale Zeichenfolge. Backslashes sind IMMER Literale .

C #

pattern = @"regex";

Beachten Sie, dass diese Syntax auch "" (zwei Anführungszeichen) als Escape-Form von " "" erlaubt .

Zeichenketten

In den meisten Programmiersprachen muss jeder Backslash im String-Literal verdoppelt werden, damit in einem String ein Backslash aus einem String-Literal generiert wird. Andernfalls wird es als Flucht für das nächste Zeichen interpretiert.

Leider muss jeder von der Regex benötigte Backslash ein wörtlicher Backslash sein. Aus diesem Grund wird es notwendig, "Escape-Fluchten" ( \\ ) zu haben, wenn Regex aus String-Literalen generiert wird.

Außerdem müssen Anführungszeichen ( " oder ' ) im Zeichenfolgenliteral möglicherweise mit Escapezeichen versehen werden, je nachdem, um welches Zeichenkettenliteral es sich handelt. In einigen Sprachen ist es möglich, einen Anführungszeichenstil für eine Zeichenfolge zu verwenden (wählen Sie den am besten lesbaren aus das gesamte String-Literal zu umgehen).

In einigen Sprachen (zB: Java <= 7) können reguläre Ausdrücke nicht direkt als Literale ausgedrückt werden, z. B. /\w/ ; Sie müssen aus Strings generiert werden, und normalerweise werden String-Literale verwendet - in diesem Fall "\\w" . In diesen Fällen müssen Literalzeichen wie Anführungszeichen, umgekehrte Schrägstriche usw. mit Escapezeichen versehen werden. Dies lässt sich am einfachsten mit einem Tool (wie RegexPlanet ) erreichen. Dieses spezielle Tool ist für Java konzipiert, funktioniert jedoch für jede Sprache mit einer ähnlichen Zeichenfolgensyntax.

Welche Zeichen müssen entkommen werden?

Durch Zeichen-Escape-Zeichen können bestimmte Zeichen (die von der Regex-Engine für die Bearbeitung von Suchen reserviert werden) buchstäblich gesucht und in der Eingabezeichenfolge gefunden werden. Die Escape-Funktion hängt vom Kontext ab. In diesem Beispiel wird daher keine Zeichenfolge- oder Trennzeichen- Escapezeichen behandelt.

Backslashes

Zu sagen, dass Backslash das "Escape" -Zeichen ist, ist etwas irreführend. Backslash entkommt und Backslash bringt; es schaltet das Metazeichen tatsächlich ein oder aus, verglichen mit dem wörtlichen Status der Figur, die sich davor befindet.

Um einen literalen Backslash überall in einer Regex verwenden zu können, muss dieser durch einen anderen Backslash ersetzt werden.

Flucht (außerhalb von Zeichenklassen)

Es gibt mehrere Zeichen, für die eine Escape-Funktion erforderlich ist (zumindest außerhalb von Zeichenklassen):

  • Halterungen: []
  • Klammern: ()
  • Geschweifte Klammern: {}
  • Betreiber: * , + ? , |
  • Anker: ^ , $
  • Andere: . , \
  • Um ein Literal ^ am Anfang oder ein Literal $ am Ende einer Regex zu verwenden, muss das Zeichen mit Escapezeichen versehen werden.
  • Einige Varianten verwenden ^ und $ als Metazeichen, wenn sie sich am Anfang bzw. Ende der Regex befinden. In diesen Geschmacksrichtungen ist keine zusätzliche Flucht notwendig. Es ist normalerweise nur das Beste, ihnen trotzdem zu entkommen.

Flucht innerhalb von Zeichenklassen

  • Es empfiehlt sich, eckige Klammern ( [ und ] ) zu umgehen, wenn sie als Literale in einer Zeichenklasse erscheinen. Unter bestimmten Umständen ist dies je nach Geschmack nicht erforderlich, beeinträchtigt jedoch die Lesbarkeit.
  • Das Caret ^ ist ein Meta-Zeichen, wenn es als erstes Zeichen einer Zeichenklasse gesetzt wird: [^aeiou] . Überall in der Zeichenklasse ist es nur ein buchstäblicher Charakter.
  • Der Bindestrich - ist ein Meta-Zeichen, es sei denn, er steht am Anfang oder Ende einer Zeichenklasse. Wenn das erste Zeichen in der Zeichenklasse ein Caret ^ , ist es ein Literal, wenn es das zweite Zeichen in der Zeichenklasse ist.

Dem Ersatz entgehen

Es gibt auch Regeln für die Flucht innerhalb der Ersetzung, aber keine der oben genannten Regeln trifft zu. Die einzigen Metazeichen sind $ und \ , zumindest wenn $ verwendet werden kann, um Capture-Gruppen zu referenzieren (zB $1 für Gruppe 1). Um ein wörtliches $ , entgehen Sie es: \$5.00 . Ebenso \ : C:\\Program Files\\ .


BRE-Ausnahmen

Während ERE (erweiterte reguläre Ausdrücke) die typische Perl-Stil-Syntax widerspiegelt, weist BRE (Basic Regular Expressions) grundlegende Unterschiede beim Fluchtweg auf:

  • Es gibt unterschiedliche Abkürzungssyntax. Alle \d , \s , \w und so weiter sind verschwunden. Stattdessen hat es eine eigene Syntax (die POSIX verwirrend "Zeichenklassen" nennt), wie [:digit:] . Diese Konstrukte müssen sich innerhalb einer Zeichenklasse befinden.
  • Es gibt wenige Metazeichen ( . , * , ^ , $ ), Die normal verwendet werden können. ALLE anderen Metazeichen müssen unterschiedlich maskiert werden:

Zahnspangen {}

  • a{1,2} entspricht a{1,2} . Verwenden Sie zum Abgleichen von a oder aa a\{1,2\}

Klammern ()

  • (ab)\1 ist ungültig, da keine Capture-Gruppe 1 vorhanden ist. Verwenden Sie \(ab\)\1 um das abab zu beheben

Backslash

  • Innerhalb von Zeichenklassen (die in POSIX Klammerausdrücke genannt werden) ist der Backslash kein Metazeichen (und muss nicht umgangen werden). [\d] stimmt entweder mit \ oder d überein.
  • Überall sonst wie üblich entkommen.

Andere

  • + und ? sind Literale. Wenn die BRE-Engine sie als Metazeichen unterstützt, müssen sie als \? und \+ .

/ Trennzeichen /

In vielen Sprachen können reguläre Ausdrücke zwischen bestimmten Zeichen eingeschlossen werden, normalerweise dem Schrägstrich / .

Begrenzungszeichen wirken sich auf das Escapeing aus: Wenn das Begrenzungszeichen / und der Regex nach / Liter suchen muss, muss der Schrägstrich vor dem Literal ( \/ ) geschützt werden.

Übermäßiger Fluchtweg schadet der Lesbarkeit. Daher müssen die verfügbaren Optionen berücksichtigt werden:

Javascript ist einzigartig, da es Schrägstrich als Trennzeichen zulässt, aber sonst nichts (obwohl es stringifizierte Regexes zulässt ).

Perl 1

Perl erlaubt zum Beispiel, dass fast alles ein Trennzeichen ist. Sogar arabische Zeichen:

$str =~ m ش ش

Spezifische Regeln werden in der Perl-Dokumentation erwähnt .

PCRE erlaubt zwei Arten von Trennzeichen: Übereinstimmende Trennzeichen und Trennzeichen im Klammerstil. Übereinstimmende Trennzeichen verwenden das Paar eines einzelnen Charakters, während Trennzeichen im Klammer-Stil ein paar Zeichen verwenden, die ein öffnendes und ein schließendes Paar darstellen.

  • Passende Trennzeichen !"#$%&'*+,./:;=?@^_`|~-
  • Trennzeichen im Klammerstil: () , {} , [] , <>


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow