Wie entkomme ich regulären Ausdruckszeichen in einer Zeichenfolge?

9

Ich komponiere einen komplexen regulären Ausdruck und der Benutzer kann einen Teil des Ausdrucks angeben. Der vom Benutzer bereitgestellte Teil sollte jedoch wörtlich interpretiert werden, dh Regexp-Sonderzeichen sollten maskiert werden. Gibt es eine Funktion, um diesen Zeichen zu entkommen? Es scheint eine übliche Sache zu sein, aber mein Googeln war erfolglos.

Beispiel:

(re-search-forward (format "\b%s\b" user-string))

Wenn user-stringja test*case, möchte ich test*caseaber nicht übereinstimmen testttttcase.

tmalsburg
quelle

Antworten:

12

Sie können verwenden regexp-quote:

Diese Funktion gibt einen regulären Ausdruck zurück, dessen einzige exakte Übereinstimmung die Zeichenfolge ist. Die Verwendung dieses regulären Ausdrucks beim Betrachten ist nur dann erfolgreich, wenn die nächsten Zeichen im Puffer Zeichenfolgen sind. Die Verwendung in einer Suchfunktion ist erfolgreich, wenn der gesuchte Text eine Zeichenfolge enthält.

(regexp-quote "^The cat$") => \\^The cat\\$

Dan
quelle
1
Vielen Dank! Aber warum war das so schwer zu finden? Manchmal macht mich die Dokumentation von Emacs verrückt.
Tmalsburg
2
Mit Mx report-emacs-bug können Sie beschreiben, wonach Sie gesucht haben und wo Sie diese Funktion erwartet haben. Möglicherweise fehlt die Dokumentation und sollte behoben werden.
YoungFrog
2
@tmalsburg Ein nützliches Schlüsselwort wäre "Escape". Vielleicht (defalias 'regexp-escape 'regexp-quote). Wurde dies auf einer der Emacs-Mailinglisten besprochen?
Ebpa