Um zu wissen, wann und was zu entkommen, ohne Versuche ist notwendig, um genau die Kette von Kontexten die Zeichenfolge durchlaufen zu verstehen. Sie werden die Zeichenkette von der am weitesten entfernten Seite bis zu ihrem endgültigen Ziel spezifizieren, das der vom Regexp-Parsing-Code bearbeitete Speicher ist.
Achten Sie darauf, wie die Zeichenkette im Speicher verarbeitet wird: if kann eine einfache Zeichenkette innerhalb des Codes sein, oder eine Zeichenkette, die in die Befehlszeile eingegeben wird, aber a könnte entweder eine interaktive Befehlszeile oder eine Befehlszeile sein, die in einer Shell-Skriptdatei angegeben ist, oder eine Variable im Speicher, die vom Code erwähnt wird, oder ein (String)Argument durch weitere Auswertung, oder eine Zeichenkette, die Code enthält, der dynamisch mit irgendeiner Art von Kapselung erzeugt wurde...
Jedem dieser Kontexte sind einige Zeichen mit besonderen Funktionen zugeordnet.
Wenn Sie das Zeichen buchstäblich übergeben wollen, ohne seine spezielle Funktion (lokal im Kontext) zu verwenden, dann müssen Sie es für den nächsten Kontext escapen... was einige andere Escape-Zeichen benötigen könnte, die zusätzlich in den vorhergehenden Kontexten escaped werden müssen. Darüber hinaus kann es Dinge wie die Zeichenkodierung geben (das heimtückischste ist utf-8, weil es für gewöhnliche Zeichen wie ASCII aussieht, aber je nach Einstellung sogar vom Terminal interpretiert werden kann, so dass es sich anders verhält, als das Encoding-Attribut von HTML/XML, es ist notwendig, den Prozess genau zu verstehen.
Z.B. Eine Regexp in der Befehlszeile, die mit perl -npe
muss auf eine Reihe von Daten übertragen werden. Ausführung Systemaufrufe, die als Pipe die Datei-Handles verbinden, jeder dieser exec-Systemaufrufe hat nur eine Liste von Argumenten, die durch (nicht escapete) Leerzeichen getrennt wurden, und möglicherweise Pipes (|) und Umleitung (> N> N>&M), Klammern, interaktive Expansion von *
y ?
, $(())
... (all dies sind Sonderzeichen, die von der *sh verwendet werden und die mit dem Zeichen des regulären Ausdrucks im nächsten Kontext zu interferieren scheinen, aber sie werden in der Reihenfolge ausgewertet: vor der Befehlszeile. Die Kommandozeile wird von einem Programm wie bash/sh/csh/tcsh/zsh gelesen, im Wesentlichen ist innerhalb von doppelten Anführungszeichen oder einfachen Anführungszeichen das Escape einfacher, aber es ist nicht notwendig, eine Zeichenkette in der Kommandozeile in Anführungszeichen zu setzen, da meistens das Leerzeichen mit einem Backslash vorangestellt werden muss und die Anführungszeichen nicht notwendig sind, wobei die Expand-Funktionalität für die Zeichen * und ? verfügbar bleibt, aber diese werden in einem anderen Kontext als innerhalb von Anführungszeichen analysiert. Wenn dann die Befehlszeile ausgewertet wird, wird die Regexp im Speicher (nicht wie in der Befehlszeile geschrieben) genauso behandelt wie in einer Quelldatei. Für regexp gibt es Zeichensatzkontext innerhalb eckiger Klammern [ ], perl reguläre Ausdrücke können durch eine große Menge von nicht alphanumerischen Zeichen zitiert werden (z.B. m// oder m:/better/for/path: ...).
Sie haben mehr Details über Zeichen in anderen Antwort, die sehr spezifisch für die endgültige regexp Kontext sind. Wie ich festgestellt, dass Sie erwähnen, dass Sie die regexp Flucht mit Versuchen zu finden, das ist wahrscheinlich, weil verschiedene Kontext hat unterschiedliche Satz von Zeichen, die Ihr Gedächtnis von Versuchen verwirrt (oft Backslash ist das Zeichen in diesen verschiedenen Kontext verwendet, um ein wörtliches Zeichen statt seiner Funktion zu entkommen).
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
2 Stimmen
Alle nicht-alphanumerischen Zeichen werden durchgestrichen. Punkt.
2 Stimmen
Diese Frage wurde in die Stack Overflow Reguläre Ausdrücke FAQ unter "Sonstiges".
1 Stimmen
Diese Frage wurde in die Stack Overflow Reguläre Ausdrücke FAQ unter "Fluchtsequenzen".
1 Stimmen
Siehe auch
\Q
...\E
fliehen.\Qhello?\E
passt zu "hallo?", aber nicht zu "hell" oder "hello". Funktioniert zumindest in PCRE/PHP/Perl/Go0 Stimmen
Wie verhält es sich mit einfachen und doppelten Anführungszeichen und "/", wie kann man diese in der BRE- und ERE-Syntax (außerhalb der Zeichenklasse) umgehen?