Elisp ha letterali regexp?


14

Il solo numero di backslash che la mia regexps richiede è piuttosto folle. Elisp ha letterali regexp, quindi posso scrivere qualcosa del genere

rx"some\(regexp\)"

invece di

"some\\(regexp\\)"

Emacs mette in evidenza alcuni costrutti espressioni regolari come \\|, \\(e \\). Sfortunatamente, in molti temi questo non è visibile. Puoi ignorare font-lock-regexp-grouping-backslashe font-lock-regexp-grouping-constructrendere questo più distinto.
Lindydancer,

2
Ho creato una patch per supportare valori letterali di stringa non elaborati, ma gli sviluppatori non sono interessati.
Knarf

1
Puoi sempre modificare il modo in cui le cose vengono visualizzate, come in questo post del blog di @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf è un peccato che Stefan non fosse interessato al supporto delle stringhe non elaborate, poiché le stringhe non elaborate sarebbero un complemento per una nuova sintassi regexp (di cui sarei a favore), non una sostituzione.
nosefrog,

Risposte:


13

Un'opzione è usare la rxmacro per costruire le tue espressioni usando sexps.

Il tuo esempio diventa (rx "some" (group "regexp"))

Ecco un altro paio di esempi dalla sezione commenti in rx.el, per avere un'idea di come rxfunziona:

Questo ^;;\\s-*\n\\|^\n diventa

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

Questo [ \t\n]*:\\([^:]+\\|$\\) diventa

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
Grazie per la modifica @knarf! Ero al telefono e non volevo fare un esempio per sbagliarmi. :-)
glucas,

Stiamo attualmente spostando molti script che usano molta ricerca regex e sostituiscono da perl a elisp a causa della rxsintassi, che li rende più facili da mantenere. Imho, per casi simili, la sintassi rx di per sé rende elisp un degno sostituto di perl python, ruby, ecc. Grazie.
gsl

7

No, non ha letterali regexp, ma molti trovano che pcre2el sia un'alternativa utile.

Specificamente usandolo da elisp in questo modo:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

Ciò richiede ancora di raddoppiare le barre rovesciate. Non hai bisogno di altrettanti per la regexp media.
cjm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.