Hat elisp reguläre Literale?

14

Die bloße Anzahl von Backslashes, die meine Regexps benötigen, ist ziemlich verrückt. Hat elisp regexp Literale, so dass ich sowas schreiben kann

rx"some\(regexp\)"

Anstatt von

"some\\(regexp\\)"
Nasenfrosch
quelle
Emacs zeigt einige regexp Konstrukte wie \\|, \\(, und \\). Leider ist dies in vielen Themen nicht sichtbar. Sie können dies überschreiben font-lock-regexp-grouping-backslashund font-lock-regexp-grouping-constructdeutlicher machen.
Lindydancer
2
Ich habe einen Patch zur Unterstützung von rohen String-Literalen geschrieben, aber die Entwickler sind nicht interessiert.
Knarf
1
Sie können jederzeit die Darstellung anpassen
glucas
@knarf Es ist eine Schande, dass Stefan kein Interesse an der Unterstützung von Raw-Strings hatte, da Raw-Strings eine Ergänzung für eine neue Regexp-Syntax darstellen würden (für die ich mich aussprechen würde), keine Ersetzung.
Nosefrog

Antworten:

13

Eine Möglichkeit besteht darin, das rxMakro zu verwenden, um Ihre Ausdrücke mit Sexps zu konstruieren.

Dein Beispiel wird (rx "some" (group "regexp"))

Hier sind einige weitere Beispiele aus dem Kommentarbereich in rx.el, um eine Vorstellung davon zu bekommen, wie es rxfunktioniert:

Das ^;;\\s-*\n\\|^\n wird

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

Das [ \t\n]*:\\([^:]+\\|$\\) wird

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))
Glucas
quelle
2
Danke für die Bearbeitung @knarf! Ich war auf meinem Handy und wollte kein Beispiel einbringen, damit ich mich irre. :-)
glucas
Wir sind gerade dabei, viele Skripte, die viel Regex-Suchen und -Ersetzen verwenden, aufgrund der rxSyntax von Perl nach Elisp zu verschieben , wodurch sie einfacher zu warten sind. In ähnlichen Fällen macht die RX- Syntax elisp zu einem würdigen Ersatz für Perl-Python, Ruby usw. Vielen Dank.
gsl
7

Nein, es gibt keine regulären Ausdrücke, aber für viele ist pcre2el eine hilfreiche Alternative.

Verwenden Sie es speziell von Elisp wie folgt:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"
Jordon Biondo
quelle
Das erfordert immer noch, dass Sie Ihre Backslashes verdoppeln. Für einen durchschnittlichen regulären Ausdruck braucht man einfach nicht so viele.
cjm