Mémento pour la syntaxe regexp

Cet aide-mémoire récapitule les parties habituellement utilisées/difficiles à se rappeler du moteur regexp disponible dans les fonctionnalités rechercher/remplacer de l’édition et de la conversion de calibre. Notez que ce moteur est plus puissant que le moteur standard de regexp utilisé dans tout le reste de calibre.

Les classes de caractères

Les classes de caractères sont utiles pour représenter différents groupes de caractères, succinctement.

Exemples :

Représentation Classe
[a-z] Lettres minuscules. Ne comprend pas les caractères accentués et les ligatures
[a-z0-9] Lettres minuscules de a à z ou chiffres de 0 à 9
[A-Za-z-] Lettre majuscule ou minuscule, ou un tiret. Pour inclure le tiret dans une classe, il faut le mettre au début ou à la fin pour ne pas le confondre avec le tiret qui spécifie une plage de caractères
[^0-9] Tout caractère sauf un chiffre. Le circonflexe (^) placé en début de classe exclut les caractères de la classe (classe complémentée)
[[a-z]--[aeiouy]] Les consonnes minuscules. Une classe peut être incluse dans une classe. Les caractères -- excluent ce qui les suit
[\w--[\d_]] Toutes les lettres (y compris les caractères accentués étrangers). Les classes abrégées peuvent être utilisées à l’intérieur d’une classe

Exemple:

<[^<>]+> to select an HTML tag

Les classes de caractères abrégées

Représentation Classe
\d Un chiffre (identique à [0-9])
\D Tout caractère non numérique (identique à [^0-9])
\w Un caractère alphanumérique plus le souligné ([a-zA-Z0-9_]) y compris les caractères accentués et les ligatures
\W Tout caractère « non-word »
\s Espace, espace insécable, tabulation, retour ligne
\S Tout caractère « non-whitespace »
. N’importe quel caractère sauf le retour ligne. Il faut cocher la case « dot all » ou utiliser la regexp (?s) pour inclure le caractère de retour de ligne

Les quantificateurs

Quantificateur Nombre occurrences de l’expression précédant le quantificateur
? 0 ou 1 occurrence de l’expression. Identique à {0,1}
+ 1 ou plusieurs occurrences de l’expression. Identique à {1,}
* 0, 1 ou plusieurs occurrences de l’expression. Identique à {0,}
{n} Exactement n occurrences de l’expression
{min,max} Nombre d’occurrences compris entre les valeurs minimales et maximales incluses
{min,} Nombre d’occurrences compris entre la valeur minimale incluse et l’infini
{,max} Nombre d’occurrences compris entre 0 et la valeur maximale incluse

La gourmandise

Par défaut, avec les quantificateurs, le moteur d’expressions rationnelles est gourmand (greedy) : il étend la sélection autant que possible. Cela réserve des surprises, au début. ? suit un quantificateur pour le rendre non gourmand (lazy). Éviter d’en mettre deux dans la même expression, le résultat peut être imprévisible.

Attention à l’imbrication des quantificateurs, comme, par exemple, le motif (a*)* : il augmente de façon exponentielle les traitements.

L’alternative

Le caractère | dans une expression régulière est un OR logique. Cela signifie que soit l’expression précédente soit l’expression suivante peut correspondre.

L’exclusion

Méthode 1

motif_à_exclure(*SKIP)(*FAIL)|motif_à_sélectionner

Exemple :

"Blabla"(*SKIP)(*FAIL)|Blabla

sélectionne Blabla, dans les chaînes Blabla ou « Blabla ou Blabla », mais pas dans « Blabla ».

Méthode 2

motif_à_exclure\K|(motif_à_sélectionner)

"Blabla"\K|(Blabla)

sélectionne Blabla, dans les chaînes Blabla ou « Blabla ou Blabla », mais pas dans « Blabla ».

Les ancres

Une ancre est un moyen de faire correspondre une position logique dans une chaîne, plutôt qu’un caractère. Les ancres les plus utiles pour le traitement de texte sont :

\b
Désigne une limite de mot, càd une transition depuis un espace à caractère non-espace. Par exemple, vous pouvez utiliser \bsurd pour correspondre à the surd mais pas absurd.
^
Correspond au début d’une ligne (en mode multi lignes, qui est le mode par défaut)
$
Correspond à la fin d’une ligne (en mode multi lignes, qui est le mode par défaut)
\K
Réinitialise l’endroit de début de la sélection à sa position dans le motif. Certains moteurs de regexp (mais pas celui de calibre) n’autorisent pas les assertions arrière de longueur variable, et notamment avec des quantificateurs. Lorsque l’on peut utiliser K avec ces moteurs-là, il permet aussi de s’affranchir de cette limite en écrivant l’équivalent d’une assertions arrière positive de longueur variable.

Groupes

(expression)
Groupe de capture, qui mémorise la sélection et qui peut être rappelée par la suite dans les motifs « rechercher » ou « remplacer » par n, où n est le numéro d’ordre du groupe de capture (en commençant à 1 dans l’ordre de lecture)
(?:expression)
Groupe qui ne mémorise pas la sélection
(?>expression)
Groupe atomique : dès que l’expression est satisfaite, le moteur de regexp passe à la suite, et si le reste du motif échoue, il ne fera pas marche arrière pour essayer d’autres combinaisons avec l’expression. Les groupes atomiques ne capturent pas.
(?|expression)
Groupe de réinitialisation de branche : les branches des alternatives inclues dans l’expression partagent les mêmes numéros de groupe
(?<name>expression)
Groupe nommé « name ». La sélection peut être rappelée par la suite dans le motif rechercher par (?P=name) et dans le remplacer par \g<name>. Deux groupes différents peuvent utiliser le même nom.

Les assertiions

Assertion Signification
?= Assertion avant positive (à placer après la sélection)
?! Assertion avant négative (à placer après la sélection)
?<= Assertion arrière positive (à placer avant la sélection)
?<! Assertion arrière négative (à placer avant la sélection)

Les assertions avant et arrière ne consomment pas de caractère, elles sont de longueur nulle et ne capturent pas. Ce sont des groupes atomiques : dès que l’assertion est satisfaite, le moteur de regexp passe à la suite, et si le reste du motif échoue, il ne fera pas marche arrière à l’intérieur de l’assertion pour essayer d’autres combinaisons.

Lorsque l’on cherche plusieurs correspondances dans une chaîne, à la position de départ de chaque tentative de correspondance, une assertion arrière peut inspecter les caractères situés avant la position actuelle. Par conséquent, sur la chaîne 123, le motif (?<=\d)\d (un chiffre précédé d’un chiffre) devrait, en théorie, sélectionner 2 et 3. En revanche, \d\K\d ne peut sélectionner que 2, car la position de départ après la première sélection est immédiatement avant 3, et il n’y a plus assez de chiffres pour une seconde correspondance. De même, \d(\d) ne capture que 2. Dans la pratique du moteur de regexp de calibre, l’assertion arrière positive se comporte de la même façon, et ne sélectionne que 2, contrairement à ce que prévoit la théorie.

On peut placer des groupes à l’intérieur des assertions, mais la capture est rarement utile. Néanmoins, si elle est utile, il faudra être très prudent dans l’utilisation d’un quantificateur dans une assertion arrière : la gourmandise associée à l’absence de marche arrière peut donner une capture surprenante. Pour cette raison, utilisez \K plutôt qu’une assertion arrière positive quand vous avez un quantificateur (ou pire, plusieurs) dans un groupe capturant de l’assertion arrière positive.

Exemple d’assertion avant négative :

(?![^<>{}]*[>}])

Placée à la fin du motif, cette assertion empêche de sélectionner à l’intérieur d’une balise ou d’un style embarqué dans le fichier.

Lorsque c’est possible, il est toujours préférable d’ »ancrer » les assertions, pour diminuer le nombre d’étapes nécessaires à l’obtention du résultat.

La récursion

Représentation Signification
(?R) Récursion du motif entier
(?1) Récursion du seul motif du groupe de capture numéroté, ici le groupe 1

La récursion consiste à s’appeler soi-même. C’est utile pour des recherches balancées, par exemple des chaînes entre apostrophes, qui peuvent contenir des chaînes entre apostrophes enchâssées. Ainsi, si au cours du traitement d’une chaîne entre apostrophes, on rencontre le début d’une nouvelle chaîne entre apostrophes, et bien on sait faire, et on s’appelle soi-même. On a alors un motif comme :

start-pattern(?>atomic sub-pattern|(?R))*end-pattern

Pour sélectionner une chaîne entre apostrophes sans s’arrêter aux chaînes enchâssées:

“((?>[^“”]+|(?R))*[^“”]+)”

C’est également ce modèle qu’il faut suivre pour modifier les paires de balises qui peuvent s’enchâsser, telles que les balises <div>.

Les caractères spéciaux

Représentation Caractère
\t tabulation
\n saut de ligne
\x20 espace (sécable)
\xa0 espace insécable

Les métacaractères

Les métacaractères sont ceux qui ont une signification spéciale pour le moteur regexp. Parmi ceux-ci, douze doivent être précédés d’un caractère d’échappement, l’antislash (\), pour perdre leur signification spéciale et redevenir un simple caractère:

^ . [ ] $ ( ) * + ? | \

Sept autres métacaractères n’ont pas besoin d’être précédés de l’antislash (mais peuvent l’être sans autre conséquence):

{ } ! < > = :

Les caractères spéciaux perdent leur statut s’ils sont utilisés à l’intérieur d’une classe (entre les crochets []). Le crochet fermant et le tiret ont un statut spécial dans une classe. En dehors de la classe, le tiret est un simple littéral, le crochet reste un métacaractère.

Le slash (/) et le croisillon (#) [carré au Québec] ne sont pas des métacaractères, a fortiori ils n’ont pas besoin d’être échappés.

Dans certains outils, comme regex101.com, avec le moteur Python, les doubles quotes ont le statut spécial de séparateur, et doivent être échappés. Ce n’est pas le cas dans l’éditeur de calibre.

Modes

(?s)
Amène le point (.) à correspondre également à des caractères de nouvelle ligne
(?m)
Rend les ancres ^ et $ à correspondre au début et à la fin de la ligne plutôt que le début et la fin de la chaîne entière.