Um zu wissen, wann und was ohne Versuche zu entkommen ist, muss man genau die Kontextkette verstehen, die der String durchläuft. Sie geben die Zeichenfolge von der entferntesten Seite bis zu ihrem endgültigen Ziel an. Dies ist der Speicher, der vom Regexp-Parsing-Code verarbeitet wird.
Beachten Sie, wie die Zeichenfolge im Speicher verarbeitet wird: Wenn es sich um eine einfache Zeichenfolge im Code oder eine in die Befehlszeile eingegebene Zeichenfolge handeln kann, kann es sich entweder um eine interaktive Befehlszeile oder eine Befehlszeile handeln, die in einer Shell-Skriptdatei angegeben ist, oder innerhalb einer Variablen im Speicher, die vom Code erwähnt wird, oder eines (Zeichenfolgen-) Arguments durch weitere Auswertung oder einer Zeichenfolge, die Code enthält, der dynamisch mit jeder Art von Kapselung generiert wird ...
Jedem dieser Kontexte wurden einige Zeichen mit besonderen Funktionen zugewiesen.
Wenn Sie das Zeichen buchstäblich übergeben möchten, ohne seine spezielle Funktion (lokal für den Kontext) zu verwenden, müssen Sie es für den nächsten Kontext maskieren ... was möglicherweise einige andere Escape-Zeichen erfordert, die möglicherweise zusätzlich benötigt werden in den vorhergehenden Kontexten entkommen. Darüber hinaus kann es Dinge wie die Zeichenkodierung geben (die heimtückischste ist utf-8, da sie für gängige Zeichen wie ASCII aussieht, aber abhängig von ihren Einstellungen optional auch vom Terminal interpretiert werden kann, sodass sie sich möglicherweise anders verhält als das Kodierungsattribut von HTML / XML, es ist notwendig, den Prozess genau richtig zu verstehen.
Beispiel: Ein regulärer Ausdruck in der Befehlszeile, der mit beginnt perl -npe
, muss an eine Reihe von Exec -Systemaufrufen übertragen werden, die als Pipe die Datei handhaben. Jeder dieser Exec-Systemaufrufe enthält nur eine Liste von Argumenten, die durch (nicht maskierte) Leerzeichen getrennt wurden. und möglicherweise Pipes (|) und Umleitung (> N> N> & M), Klammern, interaktive Erweiterung von *
und ?
,$(())
... (all dies sind Sonderzeichen, die vom * sh verwendet werden und die das Zeichen des regulären Ausdrucks im nächsten Kontext möglicherweise stören, aber in der folgenden Reihenfolge ausgewertet werden: vor der Befehlszeile. Die Befehlszeile wird von a gelesen Programmieren Sie als bash / sh / csh / tcsh / zsh, im Wesentlichen innerhalb von doppelten oder einfachen Anführungszeichen ist das Escape einfacher, aber es ist nicht erforderlich, eine Zeichenfolge in der Befehlszeile in Anführungszeichen zu setzen, da dem Leerzeichen meistens ein Backslash vorangestellt werden muss und das Anführungszeichen stehen Es ist nicht erforderlich, die Erweiterungsfunktion für die Zeichen * und? verfügbar zu lassen, aber diese Analyse unterscheidet sich von einem anderen Kontext als im Anführungszeichen. Wenn die Befehlszeile ausgewertet wird, wird der im Speicher erhaltene reguläre Ausdruck (nicht wie in der Befehlszeile angegeben) genauso behandelt wie er wäre in einer Quelldatei. Für reguläre Ausdrücke gibt es einen Zeichensatzkontext in eckigen Klammern [],Perl regulärer Ausdruck kann durch eine große Menge nicht alfa-numerischer Zeichen zitiert werden (z. B. m // oder m: / better / for / path: ...).
Sie haben weitere Details zu Zeichen in anderen Antworten, die sehr spezifisch für den endgültigen regulären Ausdruckskontext sind. Wie ich bereits erwähnt habe, erwähnen Sie, dass Sie das Regexp-Escape bei Versuchen finden. Dies liegt wahrscheinlich daran, dass in verschiedenen Kontexten unterschiedliche Zeichensätze vorhanden sind, die Ihre Erinnerung an Versuche verwirren (häufig ist Backslash das Zeichen, das in diesen unterschiedlichen Kontexten verwendet wird, um einem Literalzeichen anstelle seiner Funktion zu entkommen ).
escape()
", um die Verwendung beliebiger Zeichenfolgen als Regex-Teile zu ermöglichen.