Tempo di lettura stimato: 5 minuti
Introduzione
In generale, esistono modi meno folli di creare espressioni regolari rispetto a VIM. Per questo motivo potresti voler utilizzare altri strumenti per testare, convalidare e poi importare la tua regex nell’editor di testo.
Risparmia tempo con un buon tester
Un interessante tester di regex è regex101.com, che aiuta molto quando si compone un’espressione enorme. Ce ne sono altri molto belli, ma questo è il mio preferito.
Una volta trovata l’espressione perfetta, scopri in VIM che ora devi fare l’escape di caratteri che non dovrebbero essere letterali! E poi devi trasformarli in caratteri speciali per far funzionare il tutto…
( { } )
Ma c’è un’ottima soluzione, che consiste nel richiamare un’opzione interna chiamata very magic, che ti aiuterà molto a evitare l’escape di espressioni regolari molto lunghe.
Molto magico!
Quindi, per usare la magia, basta inserire un comando aggiuntivo prima dell’espressione regolare: \v
(Magia)
\1
very magic
In un esempio semplice e poco creativo 😆 , sposiamo il gruppo 1 e poi lo riportiamo con , aggiungendo , ignorando tutto ciò che non è sposato in questa espressione.
#sem very magic :%s/\v\(Magia\) furta-cor/\1 very magic/g #com very magic :%s/\v(Magia) furta-cor/\1 very magic/g
Finora tutto bene. Non sembra intralciare troppo il gioco. Ma facciamo un esempio più lungo, in cui il mancato utilizzo della magia può essere un vero problema.
Abbiamo 6 campi in un elenco di prodotti e dobbiamo fare alcune sostituzioni e inserimenti di righe e dati da inserire in un file .txt per generare NFe da Sefaz.
1|9388552610010|Item A|44.0000|10.0404545455|441.78 2|9488542618041|Item B|3.0000|14.0980000000|70.49 3|9588532619058|Item C|41.0000|4.9614285714|69.46 4|9583522613157|Item D|9.0000|4.5585714286|223.37 5|9588122623188|Item E|18.0000|4.8527777778|87.35 6|9384562634201|Item F|14.0000|28.2492857143|395.49 7|9285562614225|Item G|17.0000|10.7370588235|182.53 8|9186562647232|Item H|8.0000|3.2850000000|26.28 9|9280562617256|Item I|36.0000|125.0611111111|4502.20 10|9188552617270|Item J|14.0000|15.4914285714|216.88 11|9178552627324|Item K|17.0000|5.2288235294|88.89
L’elenco è stato inserito nel texter regex101.com, perfetto, tutti i campi corrispondevano.
Se lo inserisci direttamente in VIM, semplicemente non funzionerà.
\v
Ecco come dovrebbe apparire, senza usare molta magia:
#sem very magic, lotado de escapes :%s~^\(\d+\)\|\(\d\{13\}\)\|\(.*\)\|\(\d+\.\d\{4\}\)\|\(\d+\.\d\{10\}\)\|\(\d+\.\d\{2\}\)$~H|\1||\rI|\2||\3|49019900||5102|un|\4\|\5|\6||un|\4|\5|||||1|||||||\rM||\rN|\rN10d|0|103|\rO||||999|\rO07|99|0.00|\rO11|0.0000|0.0000|\rQ|\rQ04|07|\rS|\rS04|07|~g
Ora, con \v
#com very magic, mais legível, (mais) compatível com outros robôs de regex, como o do regex101, do sed -E etc :%s~\v^(\d+)\|(\d{13})\|(.*)\|(\d+\.\d{4})\|(\d+\.\d{10})\|(\d+\.\d{2})$~H|\1||\rI|\2||\3|49019900||5102|un|\4\|\5|\6||un|\4|\5|||||1|||||||\rM||\rN|\rN10d|0|103|\rO||||999|\rO07|99|0.00|\rO11|0.0000|0.0000|\rQ|\rQ04|07|\rS|\rS04|07|~g
$1 $2 $3
Nota: i mirror di gruppo nei vari motori di regex sono di solito chiamati con $: , ma in VIM è \1 \2 \3
Per non incappare in problemi molto magici e godersi solo il bello, c’è una cosa importante da sapere: diversi caratteri che non hanno un significato speciale in altri robot regex, ora lo hanno qui, in VIM.
\v
@
%
&
~
Utilizzando , si dà un significato speciale ad alcuni caratteri molto strani, come ad esempio .
Quindi, se ti servono come letterali, evadili con \
@%&~ :%s/\v\@\%\&\~
Automatizzare la magia
Purtroppo non è possibile impostare l’opzione magica in .vimrc. Puoi mappare la combinazione \v
Dovrai applicarla individualmente a tutte le regex che hai impostato./s
per generare un /s\v
automaticamente aggiungendo l’opzione cnoremap
nel tuo ~/.vimrc
(Grazie al collega Micael Levi per la segnalazione nell’eccellente community di Telegram sulle espressioni regolari).
" Mapeia s/ para /s\v cnoremap s/ s/\v
” Mappa /s in /s\v cnoremap s/ s/\v
Scopri tutte le informazioni su very magic e le altre opzioni di magia nella :guida di VIM
:help magic (...) Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z', 'A'-'Z' and '_' have special meaning: "very magic"
Domande, suggerimenti? Facci sapere nei commenti!
Vedi anche
- Installare VIM su MacOS nel modo giusto
- Ti piacciono le regex? Incontra la comunità delle Espressioni Regolari su Telegram
- Vuoi imparare le regex? Visita il sito web di Aurélio Jargas Marinho, un ottimo punto di riferimento sulle regex in Brasile. C’è un sacco di roba buona!
- Un eccellente tester di regex è Regexions 101