Temps de lecture estimé : 5 minutes
Introduction
En général, il existe des moyens beaucoup moins fous de créer des expressions régulières que dans VIM. C’est pourquoi vous pouvez utiliser d’autres outils pour tester, valider et seulement ensuite importer vos expressions régulières dans l’éditeur de texte.
Gagnez du temps avec un bon testeur
Un testeur de regex intéressant est regex101.com, qui aide beaucoup lors de la composition d’une expression volumineuse. Il en existe d’autres très intéressants, mais celui-ci est mon préféré.
Une fois que vous avez trouvé l’expression parfaite, vous découvrez dans VIM que vous devez maintenant échapper des caractères qui ne devraient pas être littéraux ! Et vous devez ensuite les transformer en caractères spéciaux pour que tout fonctionne…
( { } )
Mais il existe une excellente solution, qui consiste à appeler une option interne appelée very magic, qui vous aidera beaucoup à éviter d’échapper des expressions régulières trop longues.
Très magique !
Ainsi, pour utiliser la magie, il suffit d’insérer une commande supplémentaire avant l’expression régulière : \v
(Magia)
\1
very magic
Dans un exemple simple et peu créatif 😆, on marie le groupe 1 et on le ramène avec , en ajoutant , en ignorant tout ce qui n’est pas marié dans cette expression.
#sem very magic :%s/\v\(Magia\) furta-cor/\1 very magic/g #com very magic :%s/\v(Magia) furta-cor/\1 very magic/g
Jusqu’à présent, tout va bien. Cela ne semble pas trop gêner. Mais prenons un exemple plus long, où le fait de ne pas utiliser beaucoup de magie peut être un vrai problème.
Nous avons 6 champs dans une liste de produits et nous devons faire quelques substitutions et insertions de lignes et de données pour les intégrer dans un fichier .txt pour générer NFe à partir de 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
La liste a été insérée dans le texteur regex101.com, parfait, tous les champs correspondent.
Si vous l’insérez directement dans VIM, il ne fonctionnera tout simplement pas.
\v
Voici à quoi cela devrait ressembler, sans faire appel à la magie :
#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
Aujourd’hui, avec \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
Note : les miroirs de groupe dans les différents moteurs de regex sont généralement appelés avec $ : , mais dans VIM c’est \1 \2 \3
Pour ne pas se heurter aux problèmes de la magie et profiter des bonnes choses, il y a une chose importante à savoir : plusieurs caractères qui n’ont pas de signification particulière dans d’autres robots de regex, en ont une ici, dans VIM.
\v
@
%
&
~
L’utilisation de , permet de donner une signification particulière à certains caractères très étranges, tels que .
Par conséquent, si vous avez besoin de ces caractères en tant que littéraux, échappez-les à l’aide de \
@%&~ :%s/\v\@\%\&\~
Une automatisation très magique
Malheureusement, il n’est pas possible de définir l’option très magique dans le fichier .vimrc. Vous pouvez faire correspondre la combinaison \v
Vous devrez l’appliquer individuellement à toutes les expressions rationnelles que vous avez définies./s
pour générer un /s\v
automatiquement en ajoutant le cnoremap
dans votre ~/.vimrc
(Merci à notre collègue Micael Levi pour l’astuce dans l’excellente communauté des expressions régulières de Telegram).
" Mapeia s/ para /s\v cnoremap s/ s/\v
« Mapper /s à /s\v cnoremap s/ s/\v
Apprenez tout sur la très grande magie et les autres options magiques dans l’aide de 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"
Des questions, des suggestions ? Faites-le nous savoir dans les commentaires !
Voir aussi
- Installez VIM sur MacOS de la bonne manière
- Vous aimez les expressions régulières ? Rencontrez la communauté Expressions Régulières sur Telegram
- Vous voulez apprendre les expressions rationnelles ? Rendez-vous sur le site d’ Aurélio Jargas Marinho, une excellente référence en matière de regex au Brésil. Il y a beaucoup de bonnes choses là-dedans !
- Un excellent testeur de regex est Regex Expressions 101.