O elisp possui literais de regexp?

14

O grande número de barras invertidas que meus regexps exigem é bem louco. O elisp possui literais regexp, para que eu possa escrever algo como

rx"some\(regexp\)"

ao invés de

"some\\(regexp\\)"
nosefrog
fonte
Emacs destaca algumas construções de expressões regulares, como \\|, \\(, e \\). Infelizmente, em muitos temas isso não é visível. Você pode substituir font-lock-regexp-grouping-backslashe font-lock-regexp-grouping-constructtornar isso mais distinto.
Lindydancer
2
Eu fiz um patch para suportar literais de strings brutos, mas os desenvolvedores não estão interessados.
Knarf
1
Você sempre pode ajustar a maneira como as coisas são exibidas, como neste post do blog em @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas
@knarf é uma pena que Stefan não esteja interessado no suporte a strings brutas, porque strings brutas seriam um complemento para uma nova sintaxe regexp (da qual eu seria a favor), não uma substituição.
Nosefrog 10/02

Respostas:

13

Uma opção é usar a rxmacro para construir suas expressões usando sexps.

Seu exemplo se torna (rx "some" (group "regexp"))

Aqui estão mais alguns exemplos da seção de comentários em rx.el, para ter uma idéia de como rxfunciona:

Isso ^;;\\s-*\n\\|^\n se torna

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

Isso [ \t\n]*:\\([^:]+\\|$\\) se torna

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))
glucas
fonte
2
Obrigado pela edição @knarf! Eu estava no meu telefone e não queria dar um exemplo de que eu poderia estar errado. :-)
glucas
Na verdade, estamos no processo de mover muitos scripts que usam muita pesquisa de regex e substituem de perl para elisp por causa da rxsintaxe, o que os torna mais fáceis de manter. Em casos semelhantes, a sintaxe rx por si só faz do elisp um substituto valioso para perl python, ruby, etc. Obrigado.
GSL
7

Não, ele não possui literais regexp, mas muitos consideram o pcre2el uma alternativa útil.

Especificamente usando-o da elisp assim:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"
Jordon Biondo
fonte
Isso ainda exige que você dobre suas barras invertidas. Você simplesmente não precisa de tantos para o regexp médio.
Cjm 05/05