--- title: RegExp slug: Web/JavaScript/Reference/Global_Objects/RegExp tags: - Constructeur - Expressions rationnelles - JavaScript - Reference - RegExp translation_of: Web/JavaScript/Reference/Global_Objects/RegExp original_slug: Web/JavaScript/Reference/Objets_globaux/RegExp ---
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.
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuer à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
Les notations littérales, par constructeur ou de base sont possibles :
/modèle/marqueurs new RegExp(modèle[, marqueurs]) RegExp(modèle[, marqueurs])
modèle
RegExp
à copier. Ce motif peut inclure certains caractères spéciaux pour correspondre à un ensemble de valeurs plus large (qu'une simple chaîne littérale).marqueurs
Si cet argument est utilisé, il indique les marqueurs à utiliser pour l'expression rationnelle. Ces valeurs remplaceront celles de l'objet à copier si modèle
est un objet RegExp
(lastIndex
sera réinitialisé à 0 à partir d'ECMAScript 2015 / ES6). Cet argument est une chaîne de caractères qui peut contenir une combinaison des valeurs suivantes:
g
i
u
est également activé, les caractères Unicode équivalents pour la casse correspondent.m
u
y
lastIndex
de l'expression rationnelle (et ne cherche pas à établir de correspondance à partir d'indices au delà).s
.
peut correspondre à un saut de ligne.Il existe deux façons de créer un objet RegExp
: une notation littérale ou un constructeur. La notation littérale est délimitée par des barres obliques (slashes) tandis que le constructeur utilise des apostrophes. Ainsi, les expressions suivantes créent la même expression rationnelle :
/ab+c/i; // notation littérale new RegExp('ab+c', 'i'); // constructeur new RegExp(/ab+c/, 'i'); // notation littérale dans un constructeur
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 {{jsxref("TypeError")}} ("can't supply flags when constructing one RegExp from another") lorsque le premier argument est une RegExp et que le second argument marqueurs
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+');
RegExp.length
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.
RegExp
et les instancesDans le script suivant, on utilise la méthode {{jsxref("String.prototype.replace()", "replace()")}} de {{jsxref("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".
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.
var s = 'Et voici\nune autre ligne !'; s.match(/voici.*ligne/); // Renvoie null s.match(/voici[^]*ligne/); // Renvoie ['voici\nune autre ligne']
Cet exemple illustre comment on peut utiliser ce marqueur qui recherche une correspondance après {{jsxref("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)
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.
var url = 'http://xxx.domaine.com'; console.log(/[^.]+/.exec(url)[0].substr(7)); // affiche 'xxx'
Spécification | État | Commentaires |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Définition initiale. Implémentée avec JavaScript 1.1. |
{{SpecName('ES5.1', '#sec-15.10', 'RegExp')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-regexp-regular-expression-objects', 'RegExp')}} | {{Spec2('ES6')}} |
Le constructeur |
{{SpecName('ESDraft', '#sec-regexp-regular-expression-objects', 'RegExp')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.RegExp")}}
À partir de Firefox 34, 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)}}).