¿Elisp tiene literales regexp?

14

La gran cantidad de barras invertidas que requieren mis expresiones regulares es bastante loca. ¿Elisp tiene literales regexp, por lo que puedo escribir algo como

rx"some\(regexp\)"

en lugar de

"some\\(regexp\\)"
rana nariz
fuente
Emacs se destacan algunas construcciones de expresiones regulares como \\|, \\(, y \\). Desafortunadamente, en muchos temas esto no es visible. Puede anular font-lock-regexp-grouping-backslashy font-lock-regexp-grouping-constructhacer esto más distinto.
Lindydancer
2
Hice un parche para admitir literales de cadena sin formato, pero los desarrolladores no están interesados.
knarf
1
Siempre puedes modificar cómo se muestran las cosas, como en esta publicación de blog de @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas
@knarf es una pena que Stefan no estuviera interesado en el soporte de cadenas sin procesar, porque las cadenas sin procesar serían un complemento para una nueva sintaxis regexp (que estaría a favor), no un reemplazo.
nosefrog

Respuestas:

13

Una opción es usar la rxmacro para construir sus expresiones usando sexps.

Tu ejemplo se convierte (rx "some" (group "regexp"))

Aquí hay un par de ejemplos más de la sección de comentarios en rx.el, para tener una idea de cómo rxfunciona:

Esto se ^;;\\s-*\n\\|^\n convierte

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

Esto se [ \t\n]*:\\([^:]+\\|$\\) convierte

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))
glucas
fuente
2
Gracias por editar @knarf! Estaba en mi teléfono y no quería dar un ejemplo de que podría equivocarme. :-)
glucas
En realidad, estamos en el proceso de mover muchos scripts que usan mucha búsqueda de expresiones regulares y reemplazar de perl a elisp debido a la rxsintaxis, lo que los hace más fáciles de mantener. En mi opinión, para casos similares, la sintaxis rx por sí misma hace que elisp sea un sustituto digno de perl python, ruby, etc. Gracias.
gsl
7

No, no tiene literales regexp, pero muchos consideran que pcre2el es una alternativa útil.

Específicamente usándolo desde elisp así:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"
Jordon Biondo
fuente
Eso todavía requiere que duplique sus barras diagonales inversas. Simplemente no necesita tantos para la expresión regular promedio.
cjm