Warum verwenden mit dem Regex-Generator erstellte reguläre Ausdrücke eine andere Syntax als interaktive reguläre Ausdrücke?

26

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?

user2699
quelle
6
Es werden Ausdrücke erstellt, die direkt im Code verwendet werden können.
abo-abo
1
@ abo-abo Das ist die Antwort, nach der ich gesucht habe. Ich habe nicht bemerkt, dass es einen Unterschied zwischen den in Code verwendbaren Elementen und den in der Benutzeroberfläche verwendbaren Elementen gibt. Es scheint nicht intuitiv zu sein, dass der Neuersteller die Codesyntax verwendet, und das Handbuch sagt es nicht, aber das erklärt den Unterschied.
User2699
2
Schauen Sie sich die Wiki-Seite von ReBuilder emacs an , insbesondere die reb-query-replaceFunktionsdefinition , um den regex builder für die Erstellung interaktiver Suchvorgänge nützlicher zu machen .
Dfeich

Antworten:

29

Tatsächlich gibt es vier verschiedene re-builderSyntaxoptionen, zwischen denen Sie mit wechseln könnenC-cTAB

Zwei sind für die Regexp-Compiler in Sexp-Form rxund sregex(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) und string(die Syntax, die Sie interaktiv verwenden).

Die readSyntax 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 RET

Die stringSyntax (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 RET reb-re-syntax RET

(setq reb-re-syntax 'string)

Beachten 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 rxUnterstützung ist, dass die rx-to-stringFunktion tatsächlich verwendet wird, was nicht ganz mit der Verwendung des rxMakros im Code identisch ist . rxakzeptiert eine beliebige Anzahl von Formularargumenten und behandelt sie als implizite Folge , während rx-to-stringnur 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ür reb-force-updateist nützlich, um diese Situationen zu lösen.


Standardmäßig zeigt die Mode-Zeile "RE Builder" bei Verwendung von readoder stringSyntax und "RE Builder Lisp" bei Verwendung von rxoder sregexSyntax, aber es scheint weitaus nützlicher zu sein, die verwendete spezifische Syntax zu identifizieren (insbesondere um zwischen readund zu unterscheiden string).

Wenn Sie das delightPaket von GNU ELPA installieren , können Sie Folgendes verwenden, um der mode-Zeile einen Syntaxindikator hinzuzufügen.

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

Dies ändert den Modusnamen in der readSyntax in "Regexp [read]" , ebenso für die anderen.

Wenn Sie einen Hinweis für das oben beschriebene rxvs rx-to-stringgotcha einfügen möchten, geben Sie in der Moduszeile "Regexp [rx-to-string]" ein, wenn Sie die rxSyntax verwenden:

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
Phils
quelle