Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Notepad++ : guide pratique

Les expressions régulières

Image non disponible

Une expression régulière (abrégé expreg), en anglais regular expression (abrégé regexp), est une chaîne de caractères permettant de décrire un ensemble variable par l'utilisation d'une syntaxe précise. Cette chaîne de caractères est appelée motif, en anglais pattern.

Voir Image non disponibleExpression rationnelle.

La maîtrise de cette syntaxe vous permettra une manipulation de textes sans limite dans Notepad++ mais aussi dans la majeure partie des langages de programmation.

Cet article est publié avec l'aimable autorisation de Nicolas Liautaud.

L'article original peut être lu sur son blog : Notepad++, les expressions régulières.

17 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Distinguer les motifs et leurs résultats

Il faut bien saisir qu'un motif de recherche vise à chercher des résultats lui correspondant dans un texte, qui peuvent être remplacés selon un motif de remplacement :

  • le motif de recherche décrit quoi chercher dans ce texte, par exemple « mots commençant par un N » ;
  • les résultats de la recherche pourront alors être par exemple « Nature, Nounours, Nord » ;
  • optionnellement, le motif de remplacement décrit par quoi remplacer chaque résultat.

II. Syntaxe du motif de recherche

Notepad++ (ou plus précisément sa composante Scintilla) ne prend en compte que la syntaxe de base des expressions régulières, mais permet déjà un très grand nombre d'opérations.

Note sur les versions récentes.

Le moteur d'expression régulière de Notepad++ ne prend plus uniquement en compte la syntaxe de base des expressions régulières (dans ses premières versions oui, c'était même risible). Il utilise désormais une syntaxe perl-like (PCRE : Perl Compatible Regular Expressions) très poussée, tant dans la recherche que dans le remplacement.

Quelques exemples en vrac :

  • les « backreferences » dans la recherche : il est possible de réutiliser un groupe existant dans la regexp
 
Sélectionnez
regex : (\w{3})\1 (match tout motif de 3 caractères répété 2 fois)
texte :
source         |   résultat
abcabc abcdef  |   abcabc
  • « zero-width positive lookahead » :
 
Sélectionnez
regex : ^(?=.+) (match tout début de ligne possédant au moins un caractère, le fait d'accepter une expression non fixe (.+) n'est pas géré par tous les moteurs de regex)
remplacement : '- '
texte :
source   | résultat
abc      | - abc
def      | - def
         | 
ghi      | - ghi
  • « zero-width positive lookbehind » :
 
Sélectionnez
regex : (?<=.)$ (match toute fin de ligne précédée d'un caractère)
remplacement : .
texte :
source   | résultat
abc      | abc.
def      | def.
         | 
ghi      | ghi.
  • remplacement en majuscule :
 
Sélectionnez
regex : \b(?:(a\w*)|(\w+))\b (match séparément les mots commençant par un "a" des autres)
remplacement \u$1\U$2 (mets en majuscule la première lettre des mots commençant par "a" ou tout le mot pour les autres)
texte :
source   | résultat
abc      | Abc
def      | DEF
ghi      | GHI

Merci à Loceka pour ces précisions.

II-A. Les caractères

  • . : un point désigne n'importe quel caractère.
  • Tout autre caractère, s'il ne fait pas partie de la syntaxe des expressions régulières, se désigne lui-même.

Les expressions régulières dans Notepad++ ne sont sensibles à la casse que si l'option de recherche Respecter la casse est activée.

Exemples

  • a.c désigne littéralement « la lettre a, puis n'importe quel caractère, puis la lettre c ». Cela pourrait être abc ou a:c mais pas 123.
  • .-5% désigne littéralement « n'importe quel caractère, un tiret, le chiffre 5 puis le symbole pourcent ». Cela pourrait être a-5% mais pas a-6% ou a5%.

II-B. Début et fin de ligne

  • ^ : l'accent circonflexe désigne le début d'une ligne.
  • $ : le dollar désigne la fin d'une ligne.

Exemples

  • ^a désigne « la lettre a en début de ligne ».
  • ^. désigne « n'importe quel caractère en début de ligne ».
  • a$ désigne « la lettre a en fin de ligne ».
  • ^a$ désigne « la lettre a seule sur une ligne ».

II-C. Les répétitions

  • * : une étoile indique que le symbole précédent est présent n'importe quel nombre de fois (même 0 fois, donc qu'il n'est pas présent).
  • + : un plus indique que le symbole précédent est présent au moins une fois.

Exemples

  • ab*c désigne littéralement « la lettre a, n'importe quel nombre de fois la lettre b, puis la lettre c ». Cela peut désigner ac, abc, abbbbbc….
  • ab+c désigne littéralement « la lettre a, au moins une fois la lettre b, puis la lettre c ». Cela peut désigner abc, abbc, abbbbbc

II-D. Les ensembles

  • […] : un ensemble de caractères entre crochets désigne n'importe quel caractère présent dans cet ensemble.
  • [^…] : un ensemble entre crochets commençant par un accent circonflexe désigne n'importe quel caractère qui n'est pas présent dans cet ensemble.
  • […-…] : un tiret séparant deux caractères dans un ensemble désigne une plage de caractères.

Exemples

  • [abc7] désigne littéralement « les lettres minuscules a, b et c ou le chiffre 7 ».
  • [^abc7] désigne littéralement « n'importe quel caractère à part les lettres minuscules a, b, c et le chiffre 7 ».
  • [a-z] désigne littéralement « n'importe quelle lettre minuscule ».
  • [a-z0-9] désigne littéralement « n'importe quelle lettre minuscule ou n'importe quel chiffre ».

II-E. Les groupes

Exemples

  • a(bc)+ désigne littéralement « la lettre a puis au moins une fois le groupe de lettres ab ». Cela pourrait être abc, abcbc, abcbcbcbcbc

II-F. Échappement

Pour désigner un caractère qui est utilisé dans la syntaxe des expressions régulières, comme un crochet [, il faut l'échapper au moyen de l'antislash : \[.

Exemples

  • a\[bc\] désigne littéralement « la lettre a, puis les lettres b et c entre crochets ». C'est-à-dire la chaîne de caractères a[bc].
  • a[\bc] désigne littéralement « la lettre a, puis b ou c ou un antislash ». Cela pourrait être a\, ab ou ac.

II-G. Les mots

  • \< : désigne le début d'un mot.
  • \> : désigne la fin d'un mot.
  • \w : désigne un caractère d'un mot. Correspond à [a-zA-Z0-9_].

Exemples

  • \w+ désigne littéralement « un mot d'au moins une lettre ».

III. Syntaxe du motif de remplacement

  • Tout caractère se désigne lui-même.
  • \x : avec x un chiffre entre 1 et 9 (\1, \2…) désigne le résultat d'un groupe du motif de recherche.

Exemples

  • Dans le motif de recherche a(bc), le motif de remplacement z\1 désigne la lettre z suivie du résultat du premier groupe, donc zbc.
  • Dans le motif de recherche (a(bc))(de), \1 désigne abc, \2 désigne bc et \3 désigne de.

IV. Utilisation dans Notepad++

IV-A. La fenêtre de recherche et remplacement

Lors d'une recherche ou d'un remplacement, il est proposé de changer de Mode de recherche : choisissez Expression Régulière.

Image non disponible

Indiquez dans le champ Recherche votre motif de recherche et en cas de remplacement indiquez dans Remplacer votre motif de remplacement.

IV-B. Les plugins utiles

La fenêtre Find/Replace de TextFX est faite pour la manipulation d'expressions régulières et contient plusieurs fonctionnalités supplémentaires rendant le travail plus aisé.

Le plugin RegEx Helper est un atout important car il permet de visualiser directement tous les résultats d'un motif.

V. Exemples

V-A. Insérer du texte en début de ligne

Ouvrir la fenêtre de remplacement avec Ctrl+H et sélectionner le mode Expressions Régulières.

Rechercher le premier caractère en début de ligne (dans un groupe pour pouvoir le ré-écrire) avec :

 
Sélectionnez
^(.)

Remplacer par le texte voulu suivi du résultat du groupe, par exemple :

 
Sélectionnez
- \1

Ainsi le texte :

 
Sélectionnez
abricot
banane
cerise

Devient :

 
Sélectionnez
- abricot
- banane
- cerise

V-B. Insérer du texte en fin de ligne

Ouvrir la fenêtre de remplacement avec Ctrl+H et sélectionner le mode Expressions Régulières.

Rechercher le dernier caractère en fin de ligne (dans un groupe pour pouvoir le ré-écrire) avec :

 
Sélectionnez
(.)$

Remplacer par le résultat du groupe suivi du texte voulu, par exemple :

 
Sélectionnez
\1 :

Ainsi le texte :

 
Sélectionnez
abricot
banane
cerise

Devient :

 
Sélectionnez
abricot :
banane :
cerise :

V-C. Supprimer des décimales

Ouvrir la fenêtre de remplacement avec Ctrl+H et sélectionner le mode Expressions Régulières.

Rechercher « un chiffre ou plus suivi d'un point ou d'une virgule puis d'au moins un chiffre » :

 
Sélectionnez
([0-9]+)[.,][0-9]+

L'utilisation d'une parenthèse capturante permet de ne conserver au remplacement que la valeur entière, au moyen de :

 
Sélectionnez
\1

Par exemple :

 
Sélectionnez
8 1.0 56.82 589,273

Devient :

 
Sélectionnez
8 1 56 589

V-D. Arrondir des valeurs

La recherche/remplacement ne permet pas d'opérations proprement conditionnelles : Notepad++ n'est pas un interpréteur ou un compilateur et ne peut traiter des opérations mathématiques.

Il est donc, de manière générale, impossible d'arrondir automatiquement et facilement des valeurs dans Notepad++.

La méthode suivante permet d'arrondir toute valeur positive à l'unité la plus proche. Elle nécessite toutefois un grand nombre d'opérations, augmentant avec la taille des valeurs :

  • valeurs comprises entre 0 et 9.9999… : 11 remplacements ;
  • valeurs comprises entre 0 et 99.999… : 21 remplacements ;
  • valeurs comprises entre 0 et 999.99… : 31 remplacements.

Il est donc très vite plus intéressant de faire appel à un langage de programmation.

On prendra pour exemple la série suivante :

 
Sélectionnez
 0.0  58.256  982.498
 4.5  98.663  506.942
19.6  59.701  189.842

D'abord, arrondir les valeurs dont la première décimale est inférieure à 5 correspond à en supprimer les décimales. On recherchera donc :

 
Sélectionnez
([0-9]+)[.,][0-4][0-9]*

Pour n'en garder que la valeur entière :

 
Sélectionnez
\1
 
Sélectionnez
 0    58      982                (première décimale inférieure à 5)
 4.5  98.663  506.942
19.6  59.701  189.842

Ensuite, les valeurs dont la première décimale est comprise entre 5 et 9 doivent être augmentées de un : l'arrondi de 12.71 est 13.

Les valeurs dont le chiffre des unités est inférieur à 9 n'influeront pas le chiffre des dizaines. On peut donc déterminer neuf remplacements à effectuer afin de remplacer le chiffre des unités en conservant les chiffres précédents, successivement :

 
Sélectionnez
([0-9]*)0[.,][5-9][0-9]* remplacé par \11]
([0-9]*)1[.,][5-9][0-9]* remplacé par \12]
([0-9]*)2[.,][5-9][0-9]* remplacé par \13]
([0-9]*)3[.,][5-9][0-9]* remplacé par \14]
([0-9]*)4[.,][5-9][0-9]* remplacé par \15]
([0-9]*)5[.,][5-9][0-9]* remplacé par \16]
([0-9]*)6[.,][5-9][0-9]* remplacé par \17]
([0-9]*)7[.,][5-9][0-9]* remplacé par \18]
([0-9]*)8[.,][5-9][0-9]* remplacé par \19
 
Sélectionnez
 0    58      982
 5    99      507               (chiffre des unités inférieur à 9)
19.6  59.701  189.842

Il ne reste à ce stade plus que les valeurs avec une unité de 9, dont le remplacement doit influer sur les chiffres des dizaines.

Les remplacer demande alors de reprendre le raisonnement précédent : neuf remplacements pour les dizaines comprises entre 0 et 8 en mettant le chiffre des unités à 0.

 
Sélectionnez
([0-9]*)09[.,][5-9][0-9]* remplacé par \110]
([0-9]*)19[.,][5-9][0-9]* remplacé par \120]
...
 
Sélectionnez
 0    58      982
 5    99      507
20    60      190               (chiffre des dizaines inférieur à 9)

Et l'on recommence les neuf opérations pour les dizaines égales à 9, puis pour les centaines, etc.

Remerciements

Cet article est publié avec l'aimable autorisation de Nicolas Liautaud.

L'article original peut être lu sur son blog : Notepad++, les expressions régulières.

  

Licence Creative Commons
Le contenu de cet article est rédigé par Nicolas Liautaud et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.