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\\)"

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 ?:)))))))

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:]]+"

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.