2009-06-29 27 views
8

Sto provando a fare un search and replace with regexs.Sostituzione Regex con Emacs

Supponiamo di avere un foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt). e voglio mettere "intorno a ciascun elemento nell'elenco

io credevo dalla documentazione -. Che questo regex dovrebbe funzionare (foo[1-4]\.txt) -> "\&"

Ma non fa quello che sto facendo di sbagliato

..?

risposta

8

Nota che le staffe e le parentesi devono fuggire ("slash extra") in un ricerca regexp, ma non nel sostituire regexp.

Gli escape sono obbligatori poiché il pars parsispina l'espressione regolare prima del motore regex.

Ma, se si sta scrivendo a livello di programmazione (al contrario di una voce interattiva), è necessario sfuggire alle fughe! ay-yi-yi ....

interactive: 
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1) 

programmatic: 
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)") 

le parentesi fuggiti sono fuggiti perché sono raggruppamento, le parentesi escape sono parentesi letterali.

Si potrebbe voler controllare il Emacs Wiki Regex Crash Course e Steve Yegge's Effective Emacs regex section.

+2

Utile, ma un po 'spaventoso. "sfuggire alle fughe". Meep. –

2

provare qualcosa di simile \(foo[1-4]\.txt\)

2

Emacs espressioni regolari sempre mi cattura fuori, cos non sono Perl:

\(foo[1-4]\.txt\) 

È necessario eseguire il backslash delle parentesi in Emacs.

1

Hai già la risposta giusta per l'espressione regolare, ma in questo caso sarebbe probabilmente più semplice utilizzare le macro. Inserire il punto all'inizio del nome, e il tipo:

C-x (" M-f M-f " C-f C-f C-x) 

Cioè, avviare la registrazione di macro, inserire citazione, andare in due parole in avanti, inserire citazione, andare in due personaggi in avanti per l'elemento successivo, e interrompere la registrazione macro.

Quindi eseguire la macro con C-x e. Per ripetere, basta colpire di nuovo e.

(In Emacs 23, è possibile utilizzare F3 invece di 'C-x (', e F4 invece di entrambi 'C-x)' e 'C-x e'.)

Problemi correlati