Czy elisp ma wyrażenia regularne?

14

Sama liczba odwrotnych ukośników, których wymagają moje wyrażenia regularne, jest dość szalona. Czy elisp ma literały regularne, więc mogę napisać coś takiego

rx"some\(regexp\)"

zamiast

"some\\(regexp\\)"
żaba
źródło
Emacs podkreśla pewne konstrukcje wyrażeń regularnych, jak \\|, \\(i \\). Niestety w wielu motywach nie jest to widoczne. Możesz zastąpić font-lock-regexp-grouping-backslashi font-lock-regexp-grouping-constructuczynić to bardziej wyraźnym.
Lindydancer
2
Zrobiłem łatkę do obsługi literałów surowych, ale deweloperzy nie są zainteresowani.
knarf
1
Zawsze możesz dostosować sposób wyświetlania rzeczy, jak w tym poście na blogu @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas
@knarf szkoda, że ​​Stefan nie był zainteresowany obsługą surowych ciągów, ponieważ nieprzetworzone ciągi byłyby uzupełnieniem nowej składni wyrażenia regularnego (za którą byłbym zwolennikiem), a nie zamiennikiem.
nos żaba

Odpowiedzi:

13

Jedną z opcji jest użycie rxmakra do konstruowania wyrażeń za pomocą sexps.

Twój przykład staje się (rx "some" (group "regexp"))

Oto kilka innych przykładów z sekcji komentarzy w rx.el, aby dowiedzieć się, jak to rxdziała:

To się ^;;\\s-*\n\\|^\n staje

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

To się [ \t\n]*:\\([^:]+\\|$\\) staje

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))
glucas
źródło
2
Dzięki za edycję @knarf! Rozmawiałem przez telefon i nie chciałem podawać przykładu, że mogę się pomylić. :-)
glucas
W rzeczywistości jesteśmy w trakcie przenoszenia wielu skryptów, które używają wielu wyszukiwań wyrażeń regularnych i zamieniają z perla na elisp ze względu na rxskładnię, która ułatwia ich obsługę. Imho, dla podobnych przypadków, sama składnia rx sprawia, że ​​elisp jest godnym substytutem języka Python w języku Perl, ruby ​​itp. Dziękujemy.
gsl
7

Nie, nie ma wyrażeń regularnych , ale wielu uważa pcre2el za pomocną alternatywę.

Używając go w szczególności z elisp:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"
Jordon Biondo
źródło
To wciąż wymaga podwojenia ukośników. Po prostu nie potrzebujesz tyle dla przeciętnego wyrażenia regularnego.
cjm