MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/d6d7ff2e2f9c

Le constructeur RegExp crée un objet expression rationnelle pour la reconnaissance d'un modèle dans un texte.

Pour une introduction aux expressions rationnelles, lire le chapitre Expressions Rationnelles dans le Guide JavaScript.

Syntaxe

Les notations littérales, par constructeur ou de base sont possibles :

/modèle/indicateurs
new RegExp(modèle[, indicateurs])
RegExp(modèle[, indicateurs])

Paramètres

modèle
Le texte de l'expression rationnelle.
indicateurs

S'ils sont utilisés, les indicateurs peuvent être n'importe quelle combinaison des valeurs suivantes :

g
recherche globale ; retrouve toutes les correspondances plutôt que de s'arrêter après la première.
i
la casse est ignorée.
m
multiligne : les caractères de début et de fin (^ et $) sont traités comme travaillant sur des lignes multiples (i.e, ils correspondent au début et à la fin de chaque ligne (délimitée par \n ou \r), pas seulement au début ou à la fin de la chaîne d'entrée complète).
u
unicode : traite le modèle comme une séquence de points de code Unicode.
y
adhérence : n'établit de correspondance qu'à partir de l'indice dans la chaîne cible indiqué par la propriété lastIndex de l'expression rationnelle (et ne cherche pas à établir de correspondance à partir d'indices au delà).

Description

Il existe deux façons de créer un objet RegExp : une notation littérale ou un constructeur. Pour délimiter les chaînes, les paramètres de la notation littérale n'utilisent pas d'apostrophes, tandis que le constructeur utilise des apostrophes. Ainsi, les expressions suivantes créent la même expression rationnelle :

/ab+c/i;
new RegExp('ab+c', 'i');
new RegExp(/ab+c/, 'i');

La notation littérale effectue la compilation de l'expression rationnelle lorsque l'expression est évaluée. Utilisez la notation littérale lorsque l'expression rationnelle reste constante. Par exemple, si vous utilisez la notation littérale pour construire une expression rationnelle utilisée dans une boucle, l'expression rationnelle ne sera pas recompilée à chaque itération.

Le constructeur de l'objet expression rationnelle, par exemple new RegExp('ab+c'), effectue la compilation de l'expression rationnelle au moment de l'exécution. Utilisez la fonction constructeur quand vous savez que le modèle d'une expression rationnelle sera variable, ou si vous ne connaissez pas le modèle et que vous l'obtiendrez d'une autre source, telle qu'une saisie utilisateur.

À partir d'ECMAScript 6, new RegExp(/ab+c/, 'i') ne déclenche plus d'exception TypeError ("can't supply flags when constructing one RegExp from another") lorsque le premier argument est une RegExp et que le second argument indicateurs est présent. Une nouvelle RegExp sera créée à la place à partir des arguments.

Lorsqu'on utilise le constructeur, les règles normales d'échappement de chaîne (le fait de faire précéder d'un \ les caractères spéciaux à l'intérieur d'une chaîne) sont requises. Par exemple, les définitions suivantes sont équivalentes :

var re = /\w+/;
var re = new RegExp('\\w+');

Signification des caractères spéciaux dans les expressions rationnelles

Classes de caractères
Caractère Signification
.

(Le point) correspond à n'importe quel caractère excepté les caractères de fin de ligne : \n, \r, \u2028 ou \u2029.

Au sein d'un ensemble de caractères, le point perd son sens spécial et correspond à un point normal.

L'indicateur multiligne m ne modifie pas le comportement du point. Ainsi, pour reconnaître un modèle dans des lignes multiples, l'ensemble de caractères [^] (si vous n'avez pas une vieille version d'IE, bien sûr) pourra être utilisé, et il correspondra à n'importe quel caractère, nouvelles lignes comprises.

Par exemple, /.a/ correspondra à "ma" et "la", mais pas à "aujourd'hui", dans "aujourd'hui j'ai fait des crêpes".

\d

Correspond à n'importe quel chiffre (arabe). Équivalent à [0-9].

Par exemple, /\d/ ou /[0-9]/ correspond à "2" dans "B2 est le numéro d'appartement".

\D

Correspond à n'importe quel caractère qui n'est pas un chiffre (arabe). Équivalent à [^0-9].

Par exemple, /\D/ ou /[^0-9]/ correspond à "B" dans "B2 est le numéro d'appartement".

\w

Correspond à n'importe quel caractère alpha-numérique de l'alphabet latin de base, y compris le tiret bas. Équivalent à [A-Za-z0-9_].

Par exempe, /\w/ correspond à "p" dans "pomme", à "5" dans "5.28 €", et à "3" dans "3D".

\W

Correspond à n'importe quel caractère qui n'est pas un caractère alpha-numérique de l'alphabet latin de base, ni le tiret bas. Équivalent à [^A-Za-z0-9_].

Par exemple, /\W/ ou /[^A-Za-z0-9_]/ correspond à "%" dans "50%".

\s

Correspond à un caractère unique d'espacement (ce qui inclut l'espace, la tabulation, le saut de page, le saut de ligne et les autres espaces Unicode). Équivalent à [ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

Par exemple, /\s\w*/ correspond à " truc" dans "machin truc".

\S

Correspond à un caractère unique autre que d'espacement. Équivalent à [^ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

Par exemple, /\S\w*/ correspond à "machin" dans "machin truc".

\t Correspond à une tabulation horizontale.
\r Correspond à un retour chariot.
\n Correspond à un saut de ligne.
\v Correspond à une tabulation verticale.
\f Correspond à un saut de page.
[\b] Correspond à un retour arrière. (à ne pas confondre avec \b)
\0 Correspond au caractère NUL. Ne pas faire suivre d'un autre chiffre.
\cX

Où X une lettre entre A et Z. Correspond à un caractère de contrôle dans une chaîne.

Par exemple, /\cM/ correspond à control-M dans une chaîne.

\xhh Correspond au caractère de code hh (deux chiffres hexadécimaux).
\uhhhh Correspond au caractère UTF-16 de valeur hhhh (quatre chiffres hexadécimaux).
\u{hhhh} ou \u{hhhhh} Valable uniquement quand l'indicateur u est positionné. Correspond au caractère de valeur Unicode U+hhhh ou U+hhhhh (chiffres hexadécimaux)
\

Pour les caractères qui sont habituellement traités de façon littérale, indique que le caractère suivant est spécial et qu'il n'a pas à être interprété littéralement.

Par exemple, /b/ correspond au caractère "b". En plaçant un antislash avant le "b", c'est à dire en utilisant /\b/, le caractère devient spécial pour signifier limite de mot.

ou

Pour les caractères qui sont habituellement traités de façon spéciale, cela indique que le caractère suivant n'est pas spécial et doit être interprété littéralement.

Par exemple, "*" est un caractère spécial qui signifie que 0 ou davantage d'occurences du caractère précédent doivent être trouvées (par exemple, /a*/ signifie trouver 0 ou davantage "a"). Pour faire une recherche littérale sur "*", faites la précéder d'un antislash ; par exemple, /a\*/ correspond à "a*".

Ensembles de caractères
Caractère Signification
[xyz]
[a-c]

Un ensemble de caractères. Correspond à l'un quelconque des caractères inclus. Vous pouvez spécifier une plage de caractères en utilisant un tiret, mais si le tiret apparaît comme le premier ou le dernier caractère compris entre les crochets, il est pris comme un tiret littéral à inclure dans l'ensemble de caractères comme un caractère normal. Il est aussi possible d'inclure une classe de caractères dans un ensemble.

Par exemple, [abcd] est la même chose que [a-d]. Ils correspondent au "b" de "boeuf" et au "c" de "cher".

Également, [abcd] et [abcd-] correspondent au "b" de "boeuf", au "c" de "cher" et au "-" (tiret) de "peut-être".

De même, [\w-] est équivalent à [A-Za-z0-9_-]. Ils correspondent au le "b" de "boeuf" et au "c" de "cher", ainsi qu'au "-" (tiret) de "peut-être".

[^xyz]
[^a-c]

La négation (ou le complément) d'un ensemble de caractères. C'est-à-dire, il correspond à tout ce qui n'est pas compris dans les crochets. Vous pouvez spécifier une plage de caractères en utilisant un tiret, mais si le tiret apparaît comme le premier ou le dernier des caractères compris entre les crochets, il est pris comme un tiret littéral à inclure dans l'ensemble de caractères comme un caractère normal.

Par exemple, [^abc] est la même chose que [^a-c]. Ils correspondent initialement au "o" dans "bacon" et au "h" dans "cher".

Alternative
Caractère Signification
x|y

Correspond soit à x, soit à y.

Par exemple, /vert|rouge/ correspond à "vert" in "pomme verte" et à "rouge" dans "pomme rouge".

Limites
Caractère Signification
^

Correspond au début de l'entrée. Si l'indicateur multiligne est utilisé, cela correspond également à immédiatement après un caractère de saut de ligne.

Par exemple, /^A/ ne correspond pas à "A" dans "un A", mais correspond au premier "A" dans "Ah Ah".

$

Correspond à la fin de l'entrée. Si l'indicateur multiligne est utilisé, cela correspond également à imédiatement avant un caractère de saut de ligne.

Par exemple, /t$/ ne correspond pas au "t" de "été", mais lui correspond dans "est".

\b

Correspond à une limite de mot . C'est la position où un caractère de mot n'est pas suivi ou précédé d'un autre caractère de mot, telle qu'entre une lettre ou une espace. Notez que la limite n'est pas incluse dans la correspondance. En d'autres termes, la longueur d'une limite de mot en correspondance est nulle.

Par exemple, /\blune/ correspond au "l" dans "lune"  ;
/un\b/ ne correspond pas au 'un' dans "lune", parce que 'un' est suivi par 'e' qui est un caractère de mot ;
/une\b/ correspond au 'une' dans "lune", parce que 'une' est la fin de la chaîne, donc non suivi d'un caractère de mot ;
/\w\b\w/ ne correspondra jamais à rien, parce qu'un caractère de mot ne peut jamais être suivi à la fois par un non caractère de mot et un caractère de mot.

\B

Correspond à une non limite de mot. C'est une position où les caractères suivant et précédent sont du même type : soit tous les deux doivent être des mots, soit tous les deux doivent être des non mots, comme entre deux lettres ou deux espaces. Le début et la fin d'une chaîne sont considérés comme des non mots. De même que la limite de mot en correspondance, la limite de non mot en correspondance n'est pas non plus incluse dans la correspondance.

Par exemple, /\Bdi/ correspond à "di" dans "à midi", et /hi\B/ correspond à "hi" dans "peut-être hier".

Groupes et références arrières
Caractère Signification
(x)

Correspond à x et garde en mémoire la correspondance. On appelle cela des parenthèses capturantes.

Ainsi, /(toto)/ correspond à "toto" dans "toto truc" et garde en mémoire la correspondance.

Les groupes capturés sont numérotés dans l'ordre des parenthèses gauches des groupes, à partir de 1. La sous-chaîne correspondante peut ensuite être rappelée dans le tableau résultant avec les indices [1], ..., [n] ou depuis les propriétés $1, ..., $9 de l'objet RegExp.

Si on utilise des groupes capturants, cela implique une diminution des performances. Si on n'a pas besoin d'utiliser la sous-chaîne, on utilisera des parenthèses non-capturantes (voir ci-après).

\n

Avec n un entier positif. Cela constitue une référence arrière à la dernière sous-chaîne correspondante du n-ième groupe (en comptant la parenthèse gauche).

Ainsi, /pomme(,)\sorange\1/ correspond à "pomme, orange," dans "pomme, orange, cerise, pêche". Un exemple plus détaillé illustre cela après le tableau.

(?:x) Correspond à x mais ne mémorise pas la correspondance. Ces parenthèses sont dites non-capturantes. La sous-chaîne correspondante ne peut pas être réutilisée dans le tableau résultant ou depuis les propriétés de l'objet RegExp.
Quantificateurs
Caractère Signification
x*

Correspond à l'élément précédent répété 0 ou plusieurs fois.

Ainsi, /bo*/ correspond à "boooo" dans "un gros booonbon" et à "b" dans "un bateau", il ne correspond à rien dans "un oiseau".

x+

Correspond à l'élément précédent répété 1 ou plusieurs fois. Ce quantificateur est équivalent au quantificateur {1,}.

Ainsi, /a+/ correspond au "a" dans "maison" et à tous les "a" dans "maaaaison".

x?

Correspond à l'élément précédent présent 0 ou 1 fois.

Ainsi, /e?le?/ correspond à "el" dans "angel" et à "le" dans "angle."

S'il est utilisé immédiatement après les quantificateurs *, +, ?, ou {}, le point d'interrogation rendra le quantificateur « non-glouton » (la correspondance sera la plus petite possible), contrairement au comportement par défaut où la correspondance est la plus grande possible (« glouton »).

Le point d'interrogation est également utilisé dans les assertions d'anticipation (?=), (?!), et (?:) décrites ci-après.

x(?=y)

Correspond à x uniquement si x est suivi par y.

Ainsi, /Jack(?=Sprat)/ correspond à "Jack" uniquement si celui-ci est suivi par "Sprat". /Jack(?=Sprat|Frost)/ correspond à "Jack" uniquement si celui-ci est suivi par "Sprat" ou "Frost". En revanche, ni "Sprat" ni "Frost" ne font partie de la correspondance enregistrée.

x(?!y)

Correspond à x uniquement si x n'est pas suivi par y. Par exemple, /\d+(?!\.)/ correspond à un nombre uniquement si celui-ci n'est pas suivi d'un point décimal.

/\d+(?!\.)/.exec('3.141') correspond à "141" mais pas à "3.141".

x|y

Correspond à x ou à y.

Ainsi, /rouge|verte/ correspond à "rouge" dans "pomme rouge" et à "verte" dans "pomme verte".

x{n}

Avec n un entier positif. Correspond exactement à n occurences de l'élément précédent, x.

Ainsi, /a{2}/ ne correspond pas à "a" dans "maison", mais correspond à tous les "a" de "maaison", et aux deux premiers "a" de "maaaaison".

x{n,}

Avec n un entier positif, correspond à au moins n occurrences de l'élément précédent, x.

Ainsi, /a{2,}/ ne correspond pas à "a" dans "maison", mais correspond à tous les "a" dans "maaison" et dans "maaaaison".

x{n,m}

Avec n et m des entiers positifs, correspond à au moins n occurences et au plus m occurrences de l'élément précédent, x.

Ainsi, /a{1,3}/, ne correspond à rien dans "mison", à "a" dans "maison", aux deux "a" dans "maaison", et aux trois premiers "a" dans "maaaaaaison". On remarquera que bien pour la dernière correspondance, on ne récupère que trois fois "a" bien que le mot ait plus d'occurences.

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

Correspond comme précédemment pour *, +, ? et {...} décrit ci-avant mais afin que la correspondance soit la plus petite possible.

Par exemple, /<.*?>/ trouve "<toto>" dans "<toto> <truc>", alors que /<.*>/ trouve "<toto> <truc>".

Les quantificateurs utilisés sans ? sont qualifiés de gloutons (greedy) alors que ceux utilisant ? sont qualifiés de non-gloutons.

Propriétés

RegExp.prototype
Cette propriété permet d'ajouter des propriétés à tous les objets qui sont des expressions rationnelles.
RegExp.length
La valeur de longueur pour le constructeur dont la valeur est 2.
get RegExp[@@species]
La fonction de construction utilisée pour créer les objets dérivés.
RegExp.lastIndex
L'indice à partir duquel rechercher la prochaine correspondance.

Méthodes

L'objet global RegExp ne possède pas de méthode propre. En revanche, il hérite de certaines méthodes via sa chaîne de prototypes.

Le prototype de RegExp et les instances

Propriétés

Méthodes

Exemples

Utiliser une expression rationnelle pour modifier un format de données

Dans le script suivant, on utilise la méthode replace() de String pour effectuer une correspondance sur le prénom et le nom pour les inverser. On utilise des parenthèses capturantes pour pouvoir utiliser les correspondances dans la construction du résultat (avec $1 et $2).

var re = /(\w+)\s(\w+)/;
var chaîne = 'Alain Dupont';
var nouvelleChaîne = chaîne.replace(re, '$2, $1');
console.log(nouvelleChaîne);

Cela affichera "Dupont, Alain".

Utiliser une expression rationnelle pour découper des lignes avec différents sauts de ligne/fins de ligne

La fin de ligne par défaut dépend de la plateforme (Unix, Windows, etc.). Cette méthode de découpage fournie permet de découper indépendamment de la plateforme utilisée.

var texte = 'Un texte\net un autre\r\npuis ensuite\rla fin';
var lignes = texte.split(/\r\n|\r|\n/);
console.log(lignes); // affiche [ 'Un texte', 'et un autre', 'puis ensuite', 'la fin' ]

On voit ici que l'ordre des modèles dans l'expression rationnelle importe.

Utiliser une expression rationnelle sur plusieurs lignes

var s = 'Et voici\nune autre ligne !';
s.match(/voici.*ligne/);
// Renvoie null
s.match(/voici[^]*ligne/);
// Renvoie ['voici\nune autre ligne']

Utiliser une expression rationnelle avec l'indicateur d'adhérence

Cet exemple illustre comment on peut utiliser ce marqueur qui recherche une correspondance après RegExp.prototype.lastIndex.

var str = '#toto#';
var regex = /toto/y;

regex.lastIndex; // 0
regex.test(str); // true
regex.lastIndex = 1;
regex.test(str); // true
regex.lastIndex = 5;
regex.test(str); // false (lastIndex est pris en compte avec ce marqueur)
regex.lastIndex; // 0 (réinitialisation suite à l'échec)

Les expressions rationnelles et les caractères Unicode

Comme mentionné ci-avant, les classes \w ou \W ne correspondent qu'à des caractères ASCII "a" à "z", "A" à "Z", "0" à "9" et "_". Pour effectuer des correspondances sur d'autres caractères (comme par exemple les caractères cyrilliques), on utilisera \uhhhh, où "hhhh" représente la valeur Unicode exprimée en hexadécimal. Cet exemple illustre comment il est possible de séparer les caractères Unicode d'un mot.

var texte = 'Образец text на русском языке';
var regex = /[\u0400-\u04FF]+/g;

var corresp = regex.exec(texte);
console.log(corresp[0]);      // affiche 'Образец'
console.log(regex.lastIndex); // affiche '7'

var corresp2 = regex.exec(texte);
console.log(corresp2[0]);     // affiche 'на' (n'affiche pas text
console.log(regex.lastIndex); // affiche '15'

// et ainsi de suite

Voici une ressource tierce pour obtenir les différents intervalles Unicode des différents alphabets : Regexp-unicode-block.

Extraire un sous-domaine d'une URL

var url = 'http://xxx.domaine.com';
console.log(/[^.]+/.exec(url)[0].substr(7)); // affiche 'xxx'

Spécifications

Spécification État Commentaires
ECMAScript 1st Edition (ECMA-262) Standard Définition initiale. Implémentée avec JavaScript 1.1.
ECMAScript 5.1 (ECMA-262)
La définition de 'RegExp' dans cette spécification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'RegExp' dans cette spécification.
Standard

Le constructeur RegExp ne renvoie plus d'exception lorsqu'il est utilisé avec un objet RegExp et que le second argument est utilisé. Ajout du marqueur d'adhérence et du marqueur Unicode.

ECMAScript Latest Draft (ECMA-262)
La définition de 'RegExp' dans cette spécification.
Standard évolutif  

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Edge Internet Explorer Opera Safari
Support simple (Oui) (Oui) (Oui) (Oui) (Oui) (Oui)
Marqueur d'adhérence ("y") 39 [1] 3.0 (1.9) (Oui) Pas de support (Oui) [2] 10
Marqueur Unicode ("u") 50 46 (46) (Oui) Pas de support ? 10
Le constructeur ne génère plus d'exception si utilisé avec une RegExp et flags (Oui) 39 (39) ? Pas de support Pas de support Pas de support
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) Edge IE Mobile Opera Mobile Safari Mobile
Support simple (Oui) (Oui) (Oui) (Oui) (Oui) (Oui) (Oui)
Marqueur d'adhérence ("y") Pas de support Pas de support 1.0 (1.9) ? Pas de support Pas de support Pas de support
Marqueur Unicode ("u") ? ? 46.0 (46) ? ? ? ?
Le constructeur ne génère plus d'exception si utilisé avec une RegExp et flags Pas de support Pas de support CompatGeckoMobile("39") ? Pas de support Pas de support Pas de support

[1] Derrière une préférence.
[2] Fonctionnalité prise en charge a minima depuis la version 41.

Notes spécifiques à Gecko

À partir de Gecko 34 (Firefox 34 / Thunderbird 34 / SeaMonkey 2.31), dans le cas où on utilise un groupe capturant avec des quantificateurs qui l'invalident, le texte correspondant au groupe est désormais undefined et non la chaîne vide :

// Firefox 33 ou antérieur
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'group:" + group + "'");
}); // 'group:'

// Firefox 34 ou supérieur
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'group:" + group + "'");
}); // 'group:undefined'

Pour des raisons de compatibilité web, RegExp.$N renverra une chaîne vide au lieu de undefined (bug 1053944).

Voir aussi

Étiquettes et contributeurs liés au document

 Dernière mise à jour par : RedGuff,