Expressions rationnelles
Une expression rationnelle (expression rationnelle pour faire court) permet aux développeur·euse·s de faire correspondre des chaînes de caractères à un modèle, d'extraire des informations sur les sous-correspondances ou simplement de tester si la chaîne de caractères respecte ce modèle. Les expressions rationnelles sont utilisées dans de nombreux langages de programmation, et la syntaxe de JavaScript est inspirée de Perl (angl.).
Vous êtes encouragé·e·s à lire le guide des expressions rationnelles pour avoir un aperçu des syntaxes d'expressions rationnelles disponibles et de leur fonctionnement.
Description
Les expressions rationnelles (angl.) sont un concept important en théorie des langages formels. Elles permettent de décrire un ensemble éventuellement infini de chaînes de caractères (appelé langage). Une expression rationnelle, en son cœur, nécessite les fonctionnalités suivantes :
- Un ensemble de caractères pouvant être utilisés dans le langage, appelé alphabet.
- Concaténation :
absignifie « le caractèreasuivi du caractèreb». - Union :
a|bsignifie « soita, soitb». - Étoile de Kleene :
a*signifie « zéro ou plusieurs caractèresa».
En supposant un alphabet fini (comme les 26 lettres de l'alphabet anglais, ou l'ensemble des caractères Unicode), tous les langages réguliers peuvent être générés par les fonctionnalités ci-dessus. Bien sûr, de nombreux modèles sont très fastidieux à exprimer de cette manière (comme « 10 chiffres » ou « un caractère qui n'est pas un espace »), donc les expressions rationnelles JavaScript incluent de nombreux raccourcis, présentés ci-dessous.
Note : Les expressions rationnelles JavaScript ne sont en fait pas régulières, en raison de l'existence des rétro-références (les expressions rationnelles doivent avoir des états finis). Cependant, elles restent une fonctionnalité très utile.
Créer des expressions rationnelles
Une expression rationnelle est généralement créée comme un littéral en encadrant un motif avec des barres obliques (/) :
const regex1 = /ab+c/g;
Les expressions rationnelles peuvent également être créées avec le constructeur RegExp() :
const regex2 = new RegExp("ab+c", "g");
Elles n'ont pas de différences à l'exécution, bien qu'elles puissent avoir des implications sur les performances, la capacité d'analyse statique et l'ergonomie de l'écriture avec l'échappement des caractères. Pour plus d'informations, voir la référence RegExp.
Indicateurs d'expressions rationnelles
Les indicateurs sont des paramètres spéciaux qui peuvent modifier la façon dont une expression rationnelle est interprétée ou la façon dont elle interagit avec le texte d'entrée. Chaque indicateur correspond à une propriété d'accès sur l'objet RegExp.
| Indicateur | Description | Propriété correspondante |
|---|---|---|
d |
Génère des indices pour les correspondances de sous-chaînes de caractères. | hasIndices |
g |
Recherche globale. | global |
i |
Recherche insensible à la casse. | ignoreCase |
m |
Fait en sorte que ^ et $ correspondent au début et à la fin de chaque ligne au lieu de ceux de l'ensemble de la chaîne de caractères. |
multiline |
s |
Permet à . de correspondre aux caractères de nouvelle ligne. |
dotAll |
u |
« Unicode » ; traite un motif comme une séquence de points de code Unicode. | unicode |
v |
Une amélioration du mode u avec plus de fonctionnalités Unicode. |
unicodeSets |
y |
Effectue une recherche « collante » qui correspond à partir de la position actuelle dans la chaîne de caractères cible. | sticky |
Les indicateurs i, m et s peuvent être activés ou désactivés pour des parties spécifiques d'une expression rationnelle en utilisant la syntaxe de modificateur.
Les sections ci-dessous répertorient toutes les syntaxes d'expressions rationnelles disponibles, regroupées par leur nature syntaxique.
Assertions
Les assertions sont des constructions qui vérifient si la chaîne de caractères satisfait une certaine condition à la position définie, sans consommer de caractères. Les assertions ne peuvent pas être quantifiées.
- Assertion de limite de tampon :
\A,\z,\Z -
Assure que la position actuelle dans la chaîne de caractères se trouve strictement au début ou à la fin de la chaîne de caractères entière (
\Zautorise également un retour à la ligne en fin de chaîne de caractères), quelle que soit la présence de l'indicateurm. - Assertion de limite d'entrée :
^,$ -
Assure que la position actuelle est le début ou la fin de l'entrée, ou le début ou la fin d'une ligne si l'indicateur
mest activé. - Assertion anticipée :
(?=...),(?!...) -
Assure que la position actuelle est suivie ou non suivie par un certain motif.
- Assertion de précédence :
(?<=...),(?<!...) -
Assure que la position actuelle est précédée ou non précédée par un certain motif.
- Assertion de limite de mot :
\b,\B -
Assure que la position actuelle est une limite de mot.
Atomes
Les atomes sont les unités les plus élémentaires d'une expression régulière. Chaque atome consomme un ou plusieurs caractères dans la chaîne de caractères, et échoue soit la correspondance, soit permet au motif de continuer à correspondre avec l'atome suivant.
- Rétro-référence :
\1,\2 -
Correspond à un sous-motif précédemment capturé avec un groupe capturant.
- Groupe capturant :
(...) -
Correspond à un sous-motif et mémorise des informations sur la correspondance.
- Classe de caractères :
[...],[^...] -
Correspond à n'importe quel caractère faisant partie ou non d'un ensemble de caractères. Lorsque l'indicateur
vest activé, il peut également être utilisé pour correspondre à des chaînes de caractères de longueur finie. - Classes de caractères échappés :
\d,\D,\w,\W,\s,\S -
Correspond à n'importe quel caractère faisant partie ou non d'un ensemble de caractères prédéfini.
- Séquence de caractère échappé :
\n,\u{...} -
Correspond à un caractère qui peut ne pas pouvoir être représenté de manière pratique sous sa forme littérale.
- Caractère littéral :
a,b -
Correspond à un caractère spécifique.
- Modificateur :
(?ims-ims:...) -
Remplace les paramètres d'indicateur dans une partie spécifique d'une expression régulière.
- Rétro-référence nommée :
\k<name> -
Correspond à un sous-motif précédemment capturé avec un groupe capturant nommé.
- Groupe capturant nommé :
(?<name>...) -
Correspond à un sous-motif et mémorise des informations sur la correspondance. Le groupe peut ensuite être identifié par un nom personnalisé au lieu de son index dans le motif.
- Groupe non capturant :
(?:...) -
Correspond à un sous-motif sans mémoriser d'informations sur la correspondance.
- Séquence de classe de caractères Unicode échappé :
\p{...},\P{...} -
Correspond à un ensemble de caractères défini par une propriété Unicode. Lorsque l'indicateur
vest activé, il peut également être utilisé pour correspondre à des chaînes de caractères de longueur finie. - Joker :
. -
Correspond à tout caractère sauf les terminateurs de ligne, à moins que l'indicateur
ssoit défini.
Autres fonctionnalités
Ces fonctionnalités ne définissent aucun motif à elles seules, mais servent à composer des motifs.
- Disjonction :
| -
Correspond à l'une des alternatives séparées par le caractère
|. - Quantificateur :
*,+,?,{n},{n,},{n,m} -
Correspond à un atome un certain nombre de fois.
Séquences d'échappement
Les séquences d'échappement des expressions rationnelles désignent toute syntaxe formée de \ suivi d'un ou plusieurs caractères. Elles peuvent avoir des fonctions très différentes selon ce qui suit \. Voici la liste de toutes les « séquences d'échappement » valides :
| Séquence d'échappement | Suivie de | Signification |
|---|---|---|
\A |
Aucun | Assertion de limite de tampon |
\B |
Aucun | Assertion négative de limite de mot |
\D |
Aucun | Séquence de classe de caractères échappé représentant les caractères non numériques |
\P |
{, une propriété et/ou une valeur Unicode, puis } |
Séquence de classe de caractères Unicode échappé représentant les caractères sans la propriété Unicode indiquée |
\S |
Aucun | Séquence de classe de caractères échappé représentant les caractères qui ne sont pas des espaces |
\W |
Aucun | Séquence de classe de caractères échappé représentant les caractères qui ne sont pas des caractères de mot |
\Z |
Aucun | Assertion de limite de tampon |
\b |
Aucun | Assertion de limite de mot ; dans les classes de caractères, représente U+0008 (RETOUR ARRIÈRE) |
\c |
Une lettre de A à Z ou de a à z |
Une séquence de caractère échappé représentant le caractère de contrôle dont la valeur correspond à celle de la lettre modulo 32 |
\d |
Aucun | Séquence de classe de caractères échappé représentant les chiffres (0 à 9) |
\f |
Aucun | Séquence de caractère échappé représentant U+000C (SAUT DE PAGE) |
\k |
<, un identifiant, puis > |
Une rétro-référence nommée |
\n |
Aucun | Séquence de caractère échappé représentant U+000A (SAUT DE LIGNE) |
\p |
{, une propriété et/ou une valeur Unicode, puis } |
Séquence de classe de caractères Unicode échappé représentant les caractères associés à la propriété Unicode indiquée |
\q |
{, une chaîne de caractères, puis } |
Valide uniquement dans les classes de caractères du mode v ; représente littéralement la chaîne de caractères à reconnaître |
\r |
Aucun | Séquence de caractère échappé représentant U+000D (RETOUR CHARIOT) |
\s |
Aucun | Séquence de classe de caractères échappé représentant les caractères d'espacement |
\t |
Aucun | Séquence de caractère échappé représentant U+0009 (TABULATION) |
\u |
4 chiffres hexadécimaux ; ou {, de 1 à 6 chiffres hexadécimaux, puis } |
Séquence de caractère échappé représentant le caractère associé au point de code indiqué |
\v |
Aucun | Séquence de caractère échappé représentant U+000B (TABULATION VERTICALE) |
\w |
Aucun | Séquence de classe de caractères échappé représentant les caractères de mot (A à Z, a à z, 0 à 9, _) |
\x |
2 chiffres hexadécimaux | Séquence de caractère échappé représentant le caractère associé à la valeur indiquée |
\z |
Aucun | Assertion de limite de tampon |
\0 |
Aucun | Séquence de caractère échappé représentant U+0000 (NUL) |
\ suivi de 0 et d'un autre chiffre forme une séquence d'échappement octale historique, interdite en mode sensible à l'Unicode. \ suivi de toute autre séquence de chiffres forme une rétro-référence.
En outre, \ peut être suivi de certains caractères qui ne sont ni des lettres ni des chiffres, auquel cas la séquence d'échappement est toujours une séquence de caractère échappé représentant le caractère échappé lui-même :
\$,\(,\),\*,\+,\.,\/,\?,\[,\\,\],\^,\{,\|,\}: valides partout\-: valide uniquement dans les classes de caractères\!,\#,\%,\&,\,,\:,\;,\<,\=,\>,\@,\`,\~: valides uniquement dans les classes de caractères du modev
Les autres caractères ASCII, à savoir l'espace, ", ', _ et toute lettre non mentionnée ci-dessus, ne constituent pas des séquences d'échappement valides. En mode non sensible à l'Unicode, les séquences d'échappement qui ne figurent pas ci-dessus deviennent des échappements d'identité : elles représentent le caractère qui suit la barre oblique inverse. Par exemple, \a représente le caractère a. Ce comportement limite la possibilité d'introduire de nouvelles séquences d'échappement sans provoquer de problèmes de compatibilité ascendante, et interdit donc ces séquences en mode sensible à Unicode.
Spécifications
Compatibilité des navigateurs
Voir aussi
- Le guide des expressions rationnelles
- L'objet natif
RegExp