Sie können dem Backslash mit Regex nicht entkommen?

112

Ich verwende den folgenden regulären Ausdruck

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Ich weiß, dass es hässlich ist, aber bis jetzt erfüllt es seinen Zweck, abgesehen davon, dass der Backslash nicht erlaubt ist, wie ich denke, weil es entkommen ist. Ich habe es auch versucht, \\anstatt \\\nur die gleichen Ergebnisse zu erzielen. Irgendwelche Ideen?

Eton B.
quelle
4
Ich habe gerade den Tippfehler im Titel behoben, aber der Titel "Kannst du der Gegenreaktion nicht mit Regex entkommen?" Tatsächlich!
Adam Crossland
1
@AdamCrossland Wünschen wir uns nicht alle, dass Regex uns helfen könnte, der Gegenreaktion zu entkommen? > _>
Eton B.
2
Heck, ich wünschte nur, ich könnte dem Spiel von Regex entkommen.
Adam Crossland

Antworten:

223

Wenn Sie dies in eine Zeichenfolge innerhalb eines Programms einfügen, müssen Sie möglicherweise tatsächlich vier umgekehrte Schrägstriche verwenden (da der Zeichenfolgenparser zwei davon entfernt, wenn er für die Zeichenfolge "entfernt" wird , und der reguläre Ausdruck zwei für eine Zeichenfolge benötigt entkommen Regex Backslash).

Zum Beispiel:

regex("\\\\")

wird interpretiert als ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

wird interpretiert als ...

regex(\\)

wird als regulärer Ausdruck interpretiert, der einem einzelnen Backslash entspricht.


Abhängig von der Sprache können Sie möglicherweise eine andere Form des Zitierens verwenden, bei der Escape-Sequenzen nicht analysiert werden, um zu vermeiden, dass so viele verwendet werden müssen - beispielsweise in Python:

re.compile(r'\\')

Das rvor den Anführungszeichen stehende Zeichenfolge macht es zu einer rohen Zeichenfolge, die keine Backslash-Escapezeichen analysiert.

Bernstein
quelle
14
hehe ... Ich bin gerade darauf gestoßen und musste drei hinzufügen. Ich habe nur so lange Backslashes hinzugefügt, bis es funktioniert hat.
Billynoah
ähm, warum um alles in der Welt wird dieser Regex zweimal neu interpretiert, anstatt einmal, wie es für PCRE sein soll?
Jim Michaels
3
@JimMichaels, da nicht alle Sprachen nicht entweichende Regex-Literale haben und daher manchmal die Programmiersprache selbst Slash-Escapezeichen einmal in ihrer String-Syntax interpretiert und die resultierende Zeichenfolge dann an die Regex-Engine übergeben wird (die Slash-Escapezeichen in Regex-Syntax interpretiert).
Amber
1
Vor langer Zeit musste ich einmal einen xpath eines Elements erfassen, dessen einziges identifizierendes Merkmal ein Windows-Dateipfad war, und dann ein Programm (als Zeichenfolge) generieren, in dem xpaths als Zeichenfolgen dargestellt werden sollten. An einem Punkt in den Zwischenschritten wurden 8 Backslashes verwendet, um einen einzelnen Backslash im Dateipfad darzustellen. Das ist das Höchste, was ich je bekommen habe.
Zackkenyon
Dies kann bei der Suche nach Backslashes und Mustern, für die Metazeichen erforderlich sind, noch komplizierter werden. Nehmen Sie zum Beispiel einen Backslash gefolgt von einer Ziffer. Jetzt würden Sie auf den folgenden Ausdruck starren, um herauszufinden, was los ist : new RegExp('\\\\\\d');.
Jabacchetta
15

Wenn es kein Literal ist, müssen Sie es verwenden, \\\\damit Sie erhalten, \\was einen entkommenen Backslash bedeutet.

Das liegt daran, dass es zwei Darstellungen gibt. In der Zeichenfolgendarstellung Ihres regulären Ausdrucks haben Sie Folgendes: "\\\\"Was wird an den Parser gesendet? Der Parser sieht, \\was er als gültigen Escape-Backslash interpretiert (der einem einzelnen Backslash entspricht).

Vivin Paliath
quelle
10

Der Backslash \ist das Escape-Zeichen für reguläre Ausdrücke. Daher würde ein doppelter Backslash tatsächlich einen einzelnen, wörtlichen Backslash bedeuten.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

Ref: http://www.regular-expressions.info/reference.html

Brad
quelle
4

Von http://www.regular-expressions.info/charclass.html :

Beachten Sie, dass die einzigen Sonderzeichen oder Metazeichen innerhalb einer Zeichenklasse die schließende Klammer (]), der Backslash (\\), das Caret (^) und der Bindestrich (-) sind. Die üblichen Metazeichen sind normale Zeichen innerhalb einer Zeichenklasse und müssen nicht durch einen Backslash maskiert werden. Verwenden Sie [+ *], um nach einem Stern oder Plus zu suchen. Ihre Regex funktioniert einwandfrei, wenn Sie den regulären Metazeichen innerhalb einer Zeichenklasse entkommen, dies jedoch die Lesbarkeit erheblich beeinträchtigt.

Um einen Backslash als Zeichen ohne besondere Bedeutung in eine Zeichenklasse aufzunehmen, müssen Sie ihn mit einem anderen Backslash maskieren. [\\ x] entspricht einem Backslash oder einem x. Die schließende Klammer (]), das Caret (^) und der Bindestrich (-) können eingefügt werden, indem sie mit einem Backslash ausgeblendet werden oder indem sie in eine Position gebracht werden, in der sie ihre besondere Bedeutung nicht annehmen. Ich empfehle die letztere Methode, da sie die Lesbarkeit verbessert. Um ein Caret aufzunehmen, platzieren Sie es an einer beliebigen Stelle außer direkt nach der öffnenden Halterung. [x ^] entspricht einem x oder einem Caret. Sie können die schließende Klammer direkt nach der öffnenden Klammer oder dem negierenden Caret platzieren. [] x] entspricht einer schließenden Klammer oder einem x. [^] x] entspricht jedem Zeichen, das keine schließende Klammer oder ein x ist. Der Bindestrich kann direkt nach der öffnenden Klammer oder direkt vor der schließenden Klammer oder direkt nach dem negierenden Caret eingefügt werden.

In welcher Sprache schreiben Sie den regulären Ausdruck?

Nate
quelle
0

Diese Lösung hat mein Problem behoben, während das br-Tag durch '\ n' ersetzt wurde.

alert(content.replace(/<br\/\>/g,'\n'));
hltsydmr
quelle