Perché le espressioni regolari create con il generatore di regex usano una sintassi diversa dalle espressioni regolari interattive?


26

Quindi, usando il generatore di espressioni regolari (Mx re-builder), trovando le righe che terminano in \ accetta "\\ $", mentre nella ricerca e sostituiscono con regex, ci vuole solo "\ $". Mi sarei aspettato che il generatore di regex costruisse espressioni direttamente utilizzabili, quindi cosa spiega questa differenza?


6
Costruisce espressioni direttamente utilizzabili nel codice.
abo-ABO

1
@ abo-abo Questa è la risposta che stavo cercando, non mi rendevo conto che c'è una differenza tra ciò che è utilizzabile nel codice e ciò che è utilizzabile nell'interfaccia utente. Sembra contro intuitivo che re-builder usi la sintassi dei codici e il manuale non lo dice, ma questo spiega la differenza.
user2699

2
Al fine di rendere più utile regex builder per la composizione di ricerche interattive, dai un'occhiata alla pagina wiki di ReBuilder emacs , in particolare la reb-query-replacedefinizione della funzione.
Dfeich,

Risposte:


29

Esistono in realtà quattro diverse re-builderopzioni di sintassi e puoi passare da una all'altraC-cTAB

Due sono per i compilatori regexp sexp-form rxe sregex(ma poiché il primo è più completo e quasi completamente compatibile con la sintassi, puoi davvero ignorare sregex a meno che tu non stia lavorando con il vecchio codice che lo usava).

Le altre due opzioni di sintassi sono read(impostazione predefinita) e string(che è la sintassi che si utilizza in modo interattivo).

La readsintassi è la sintassi del 'codice' - cioè riconosciuta dal lettore lisp - in cui si inserisce la regexp secondo la sintassi di lettura per le stringhe :

C-hig (elisp) Syntax for Strings RET

La stringsintassi (che ho sempre considerato un nome inutilmente confuso in questo contesto) è la sintassi di una stringa di espressione regolare che è già stata letta e che pertanto non ha alcun carattere di escape necessario durante la scrittura della stringa. Vale a dire, questa è la sintassi dell'espressione regolare effettiva , la stessa che usi quando Emacs ti richiede in modo interattivo.

Se si desidera utilizzare la sintassi della stringa per impostazione predefinita, aggiungere quanto segue al file init o utilizzare M-x customize-option RET reb-re-syntax RET

(setq reb-re-syntax 'string)

Si noti che è possibile alternare tra la sintassi di lettura e stringa durante la modifica di regexp, senza perdita di dati. Puoi anche passare dai form di sexp alla sintassi read / string (naturalmente; compilare sexp in stringhe è ciò a cui servono quelle librerie), ma non puoi andare nell'altra direzione e generare un sexp da una stringa. re-builder ricorda qual era il sexp, quindi non perdi quella forma quando cambi sintassi; ma inoltre non viene aggiornato se si modifica regexp in una sintassi diversa e poi si torna indietro. In breve, se stai costruendo il regexp come sexp, assicurati di modificarlo solo mentre usi quella sintassi.


Un problema con il rxsupporto è che sta effettivamente utilizzando la rx-to-stringfunzione, che non è del tutto identica all'utilizzo della rxmacro nel codice. rxaccetta un numero arbitrario di argomenti di forma e li tratta come una sequenza implicita , mentre rx-to-stringaccetta solo una forma singola e qualsiasi sequenza di livello superiore deve essere resa esplicita '(sequence ...)o equivalente.

In breve, quando si inserisce un modulo '(...)in re-builder, viene elaborato come (rx-to-string '(...))e non(rx ...)

Si noti inoltre che un modulo non valido potrebbe causare re-builderl'interruzione dell'aggiornamento dinamico delle corrispondenze nel buffer associato, anche dopo che il modulo è stato reso nuovamente valido. L' C-cC-uassociazione per reb-force-updateè utile per risolvere queste situazioni.


Per impostazione predefinita, la riga della modalità mostra "RE Builder" quando si utilizza reado la stringsintassi e "RE Builder Lisp" quando si utilizza rxo la sregexsintassi, ma sembra molto più utile identificare la sintassi specifica in uso (in particolare per distinguere tra reade string).

Se si installa il delightpacchetto da GNU ELPA, è possibile utilizzare quanto segue per aggiungere un indicatore di sintassi alla riga della modalità.

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

Questo cambia il nome della modalità in "Regexp [leggi]" nella readsintassi e allo stesso modo per gli altri.

O per includere un suggerimento per il rxvs rx-to-stringgotcha descritto sopra, fai dire alla riga della modalità "Regexp [rx-to-string]" quando usi la rxsintassi:

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
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.