Elisp a-t-il des littéraux regexp?

14

Le nombre de barres obliques inverses dont mes regexps ont besoin est assez fou. Elisp a-t-il des littéraux regexp, donc je peux écrire quelque chose comme

rx"some\(regexp\)"

au lieu de

"some\\(regexp\\)"
ouaouaron
la source
Emacs met en évidence quelques constructions regexp comme \\|, \\(et \\). Malheureusement, dans de nombreux thèmes, cela n'est pas visible. Vous pouvez remplacer font-lock-regexp-grouping-backslashet font-lock-regexp-grouping-constructrendre cela plus distinct.
Lindydancer
2
J'ai créé un correctif pour prendre en charge les littéraux de chaîne bruts, mais les développeurs ne sont pas intéressés.
knarf
1
Vous pouvez toujours modifier la façon dont les choses sont affichées, comme dans cet article de blog par @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas
@knarf c'est dommage que Stefan ne soit pas intéressé par le support des chaînes brutes, car les chaînes brutes seraient un complément pour une nouvelle syntaxe regexp (que je serais en faveur), pas un remplacement.
nosefrog

Réponses:

13

Une option consiste à utiliser la rxmacro pour construire vos expressions à l'aide de sexps.

Votre exemple devient (rx "some" (group "regexp"))

Voici quelques autres exemples de la section des commentaires dans rx.el, pour avoir une idée du rxfonctionnement:

Cela ^;;\\s-*\n\\|^\n devient

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

Cela [ \t\n]*:\\([^:]+\\|$\\) devient

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))
glucas
la source
2
Merci pour l'édition @knarf! J'étais sur mon téléphone et je ne voulais pas donner d'exemple qui pourrait me tromper. :-)
glucas
Nous sommes en train de déplacer de nombreux scripts qui utilisent beaucoup de recherche regex et remplacent de perl vers elisp en raison de la rxsyntaxe, ce qui les rend plus faciles à maintenir. À mon humble avis , pour des cas similaires, la syntaxe rx en elle-même fait d'elisp un substitut digne de ce nom pour le python perl, le rubis, etc. Merci.
gsl
7

Non, il n'a pas de littéraux regexp, mais beaucoup trouvent pcre2el comme une alternative utile.

En l'utilisant spécifiquement à partir d'Elisp comme ceci:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"
Jordon Biondo
la source
Cela vous oblige toujours à doubler vos barres obliques inverses. Vous n'en avez tout simplement pas besoin d'autant pour l'expression rationnelle moyenne.
cjm