Wenn Sie also den Builder für reguläre Ausdrücke (Mx re-builder) verwenden, werden beim Suchen und Ersetzen durch reguläre Ausdrücke nur "\ $" benötigt, um Zeilen zu finden, die mit \ enden. Ich hätte erwartet, dass der Regex-Builder direkt verwendbare Ausdrücke erstellt. Worauf beruht dieser Unterschied?
elisp
regular-expressions
user2699
quelle
quelle
reb-query-replace
Funktionsdefinition , um den regex builder für die Erstellung interaktiver Suchvorgänge nützlicher zu machen .Antworten:
Tatsächlich gibt es vier verschiedene
re-builder
Syntaxoptionen, zwischen denen Sie mit wechseln könnenC-cTABZwei sind für die Regexp-Compiler in Sexp-Form
rx
undsregex
(da der erstere jedoch umfassender und fast vollständig syntaktisch kompatibel ist, können Sie sregex wirklich ignorieren, es sei denn, Sie arbeiten zufällig mit altem Code, der ihn verwendet hat).Die anderen beiden Syntaxoptionen sind
read
(die Standardeinstellung) undstring
(die Syntax, die Sie interaktiv verwenden).Die
read
Syntax ist die 'Code'-Syntax - dh wie vom Lisp-Reader erkannt -, in der Sie den regulären Ausdruck gemäß der Lesesyntax für Zeichenfolgen eingeben :C-hig
(elisp) Syntax for Strings
RETDie
string
Syntax (die ich in diesem Zusammenhang immer als unnötig verwirrend angesehen habe) ist die Syntax einer Zeichenfolge mit regulären Ausdrücken, die bereits gelesen wurde und die daher keine Zeichen enthält, die beim Schreiben der Zeichenfolge maskiert werden müssen. Das heißt, dies ist die eigentliche Syntax für reguläre Ausdrücke, die Sie auch verwenden, wenn Emacs Sie interaktiv dazu auffordert.Wenn Sie standardmäßig die Zeichenfolgensyntax verwenden möchten, fügen Sie der Init-Datei Folgendes hinzu, oder verwenden Sie M-x
customize-option
RETreb-re-syntax
RETBeachten Sie, dass Sie beim Bearbeiten des regulären Ausdrucks ohne Datenverlust zwischen Lese- und Zeichenfolgensyntax wechseln können. Sie können auch von den Sexp-Formularen zur Lese- / Zeichenfolgensyntax wechseln (natürlich ist das Kompilieren von Sexps zu Zeichenfolgen das, wofür diese Bibliotheken bestimmt sind), aber Sie können nicht in die andere Richtung gehen und ein Sexp aus einer Zeichenfolge generieren. re-builder merkt sich, was der sexp war, damit Sie diese Form nicht verlieren , wenn Sie die Syntax ändern. Es wird jedoch auch nicht aktualisiert, wenn Sie den regulären Ausdruck in einer anderen Syntax ändern und dann zurückkehren. Kurz gesagt, wenn Sie den regulären Ausdruck als Sexp erstellen, stellen Sie sicher, dass Sie ihn nur bearbeiten, während Sie diese Syntax verwenden.
Ein Problem mit der
rx
Unterstützung ist, dass dierx-to-string
Funktion tatsächlich verwendet wird, was nicht ganz mit der Verwendung desrx
Makros im Code identisch ist .rx
akzeptiert eine beliebige Anzahl von Formularargumenten und behandelt sie als implizite Folge , währendrx-to-string
nur ein einzelnes Formular akzeptiert wird und jede Folge der obersten Ebene explizit mit'(sequence ...)
oder gleichwertig sein muss.Kurz gesagt, wenn Sie ein Formular eingeben
'(...)
in Re-Builder wird es verarbeitet , wie(rx-to-string '(...))
und nicht(rx ...)
Beachten Sie auch, dass ein ungültiges Formular dazu führen kann
re-builder
, dass die Übereinstimmungen im zugehörigen Puffer möglicherweise nicht mehr dynamisch aktualisiert werden, selbst wenn das Formular wieder gültig ist. Die C-cC-uBindung fürreb-force-update
ist nützlich, um diese Situationen zu lösen.Standardmäßig zeigt die Mode-Zeile "RE Builder" bei Verwendung von
read
oderstring
Syntax und "RE Builder Lisp" bei Verwendung vonrx
odersregex
Syntax, aber es scheint weitaus nützlicher zu sein, die verwendete spezifische Syntax zu identifizieren (insbesondere um zwischenread
und zu unterscheidenstring
).Wenn Sie das
delight
Paket von GNU ELPA installieren , können Sie Folgendes verwenden, um der mode-Zeile einen Syntaxindikator hinzuzufügen.Dies ändert den Modusnamen in der
read
Syntax in "Regexp [read]" , ebenso für die anderen.Wenn Sie einen Hinweis für das oben beschriebene
rx
vsrx-to-string
gotcha einfügen möchten, geben Sie in der Moduszeile "Regexp [rx-to-string]" ein, wenn Sie dierx
Syntax verwenden:quelle