[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Regular_expressions [Back]  [Original]

Expressions rationnelles - JavaScript | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

Expressions rationnelles

Les expressions rationnelles sont des motifs utiliss pour correspondre certaines combinaisons de caractres au sein de chanes de caractres. En JavaScript, les expressions rationnelles sont galement des objets. Ces motifs sont utiliss avec les mthodes exec et test de RegExp, et avec les mthodes match, matchAll, replace, replaceAll, search et split de String. Ce chapitre explique comment utiliser les expressions rationnelles en JavaScript (aussi appeles expressions rgulires ou RegExp ).

Dans cet article

Crer une expression rationnelle

Il est possible de construire une expression rationnelle de deux faons :

  • Utiliser un littral d'expression rgulire, qui correspond un motif contenu entre deux barres obliques, par exemple :

    js
    var re = /ab+c/;
    

    Lorsque les littraux d'expression rgulire sont utiliss, l'expression est compile lors du chargement du script. Il est prfrable d'utiliser cette mthode lorsque l'expression rgulire reste constante, afin d'avoir de meilleurs performances.

  • Appeler le constructeur de l'objet RegExp, par exemple :

    js
    var re = new RegExp("ab+c");
    

    Avec cette mthode, l'expression rationnelle est compile lors de l'excution. On utilisera cette mthode lorsque le motif utilis est variable ou provient d'une autre source (par exemple une interaction utilisateur).

crire une expression rationnelle

Le motif d'une expression rationnelle est compos de caractres simples (comme /abc/), ou de caractres simples et spciaux, comme /ab*c/ ou /Chapitre (\d+)\.\d*/. Le dernier exemple utilise des parenthses qui permettent d'avoir une mmoire . La correspondance avec le motif contenu entre parenthses pourra tre utilise par la suite. Ceci est dcrit avec ce paragraphe.

Utiliser des motifs simples

Les motifs simples sont construits partir de caractres pour lesquels on souhaite avoir une correspondance directe. Le motif /des/ correspond lorsqu'on observe exactement les caractres 'des' ensemble et dans cet ordre prcis. On pourrait utiliser ce motif et dtecter une correspondance dans les chanes suivantes : "J'ai vu des licornes ?" et "Sa description de licorne tait superbe" car la chane de caractres 'des' y est prsente (dans le mot description pour le second exemple). Il n'y aura pas de correspondance avec la chane de caractres "Toc toc" car 'des' n'est pas prsente.

Utiliser des caractres spciaux

Lorsque le motif trouver est plus complexe qu'une simple galit (trouver tous les B, les blancs...), le motif devra contenir des caractres spciaux. Ainsi, le motif /ab*c/ correspond toutes les combinaisons de caractres qui possdent un seul 'a' suivi de zro ou plusieurs 'b' (l'astrisque utilise ici signifie que l'lment qui la prcde doit tre prsent zro ou plusieurs fois) qui sont immdiatement suivis d'un 'c'. Par exemple, la chane de caractre "cbbabbbbcdebc" correspond au motif avec la chane de caractres 'abbbbc'.

Les pages suivantes dcrivent en dtail les caractres spciaux qui peuvent tre utiliss afin de composer une expression rationnelle.

Assertions

Une assertion caractrisant la faon dont la correspondance peut se produire (en recherchant un motif avant, aprs ou avec une expression conditionnelle).

Limites

Permet d'indiquer le dbut ou la fin d'une ligne ou d'un mot.

Classes de caractre

Les classes permettent de distinguer diffrents caractres selon diffrents groupes (par exemple les lettres et les chiffres).

Groupes et intervalles

Permet d'indiquer un groupe ou un intervalle de caractres.

Quantificateurs

Permet d'indiquer un nombre de caractres ou d'expressions qui doivent correspondre.

Proprits Unicode

Permet de distinguer les caractres en fonction de leurs caractristiques Unicode (majuscule/minuscule, symbole mathmatique, ponctuation).

chapper des caractres

SI on souhaite rechercher certains caractres dans une chane de caractres et que ceux-ci ont une signification spciale lorsqu'ils font partie d'une expression rationnelle (ex. "*"), il faudra chapper ces caractres spciaux en plaant une barre oblique inverse (backslash "\") devant. Ainsi, si on souhaite trouver un "a" suivi d'un astrisque ("*") suivi d'un "b", on pourra composer l'expression rationnelle : /a\*b/ o la barre oblique inverse chappe l'astrisque afin de lui enlever sa signification particulire.

De mme si on crit un littral d'expression rationnelle et qu'on souhaite rechercher une barre oblique ("/") dans la chane cible, on pourra chapper ce caractre (sinon, il aura sa signification particulire aux expressions rationnelles et indiquera la fin du motif). Si on cherche la prsence de "/exemple/" dans une chane de caractres, on pourra utiliser le littral /\/exemple\//.

Il en va de mme avec la barre oblique inverse (dont la signification spcifique est justement l'chappement) : si on veut rechercher la chane "C:\", on pourra utiliser le motif /C:\\/ (la premire barre oblique inverse sert chapper la seconde).

Lorsqu'on utilise le constructeur RegExp avec une chane de caractres en paramtre (plutt qu'un littral), il faudra chapper la barre oblique inverse qui a un sens particulier dans les chanes de caractres. Ainsi, le littral /a\*b/ et new RegExp("a\\*b") creront la mme expression (qui permet de chercher la lettre "a", suivie d'un astrisque, suivi de la lettre "b").

La tableau qui suit fournit une liste complte des caractres spciaux pouvant tre utiliss dans les expressions rgulires ainsi que leur signification.

Caractres spciaux utilisables pour les expressions rationnelles.
Caractre Signification
\

Correspond selon les rgles suivantes :

Une barre oblique inverse (backslash) prcdant un caractre non spcial indique que le caractre qui suit est spcial et qu'il ne doit pas tre interprt directement. Ainsi, un 'b', sans \ avant, correspondra pour les 'b' minuscules quel que soit leur position. En revanche '\b' ne correspondra aucun caractre mais indique un caractre de fin de mot.

Un backslash prcdant un caractre spcial indique que le caractre qui suit doit tre interprt littralement (et non pas comme un caractre spcial). Ainsi, le motif /a*/ utilise le caractre spcial '*' pour correspondre 0 ou plusieurs 'a'. Le motif /a\*/, au contraire, rend '*' non-spcial pour correspondre aux chanes de caractres qui comportent la lettre a et une astrisque, comme 'a*'.

Il ne faut pas oublier d'chapper le caractre \ car lui-mme est un caractre d'chappement dans les chanes de caractres. Cela est utile lorsqu'on utilise la notation RegExp("motif").

^ Correspond au dbut la squence. Si le marqueur (flag) de lignes multiples vaut true, il correspondra galement immdiatement aprs un caractre de saut de ligne.

Ainsi, /^A/ ne correspond pas au 'A' de "un A", mais correspond au 'A' de "Arceau".

Le caractre '^' possde un sens diffrent lorsqu'il est utilis dans un motif d'ensemble de caractres. Voir les complments sur les ensembles de caractres pour plus de dtails et d'exemples.
$

Correspond la fin de la squence. Si le marqueur (flag) de lignes multiples vaut true, il correspondra galement immdiatement avant un caractre de saut de ligne.

Ainsi, /t$/ ne correspond pas au 't' de "printemps", mais correspond au 't' de "aliment".

*

Correspond l'expression prcdente qui est rpte 0 ou plusieurs fois. quivalent {0,}

Ainsi, /bo*/ correspond 'boo' dans "Un boolen" et 'b' dans "Un bateau bleu", mais ne correspond rien dans "Ce matin".

+

Correspond l'expression prcdente qui est rpte une ou plusieurs fois. C'est quivalent {1,}.

Ainsi, /a+/ correspond au 'a' dans "maison" et tous les 'a' dans "maaaaaaison" mais ne correspond rien dans "mission".

? Correspond l'expression prcdente qui est prsente une fois ou pas du tout. C'est quivalent {0,1}.

Ainsi, /e?le?/ correspond au 'el' dans "gel" et au 'le' dans "angle" mais aussi au 'l' dans "Oslo".

S'il est utilis immdiatement aprs l'un des quantificateurs : *, +, ?, ou {}, il rend le quantificateur moins gourmand auquel cas le moins de caractres correspond (le comportement par dfaut, gourmand , permettant de faire correspondre le plus de caractres possible). Par exemple /\d+/ utilise avec "123abc" fait correspondre "123". Utiliser /\d+?/ la mme chane de caractres fait correspondre "1".

Ce symbole est galement utilis dans les tests de prsence autour de l'expression, dcrits par les lignes x(?=y) et x(?!y) de ce tableau.
.

Par dfaut, (Le point) correspond n'importe quel caractre except un caractre de saut de ligne.

Ainsi, /.n/ correspond 'un' et 'en' dans "Un baobab nain en cours de croissance" mais pas 'nain'.

Si le marqueur s (dotAll) est utilis, le point correspondra galement aux caractres de saut de ligne.

(x)

Correspond 'x' et garde la correspondance en mmoire. Les parenthses permettent de capturer l'expression dans un groupe .

Les '(toto)' et '(truc)', dans le motif /(toto) (truc) \1 \2/ correspondent et gardent en mmoire les deux premiers mots de la chane de caractre "toto truc toto truc". Les \1 et \2 du motif correspondent respectivement la premire et la deuxime correspondances pour les sous-chanes entre parenthses. Lorsqu'on souhaite effectuer un remplacement, on utilisera $1 et $2 pour faire rfrence au premier et second groupe et $n pour faire rfrence au n-ime groupe captur (ex. ('toto truc'.replace(/(...) (...)/, '$2 $1'). $& fera rfrence la chane entire).

(?:x) Correspond 'x' mais ne garde pas la correspondance en mmoire. Les parenthses ne capturent pas l'expression et permettent d'utiliser des sous-expressions d'une expression rgulire pour travailler plus finement. L'expression /(?:zoo){1,2}/ sans parenthses non-capturantes les caractres {1,2} ne s'appliqueraient qu'au dernier 'o' de 'zoo'. Avec les parenthses capturantes, {1,2} s'applique au mot entier 'zoo'. Pour plus d'informations, voir Utiliser les parenthses ci-aprs.
x(?=y)

Correspond 'x' seulement s'il est suivi de 'y'. On appelle cela un test de succession (lookahead).

Ainsi, /Jack(?=Sparrow)/ correspond 'Jack' seulement s'il est suivi de 'Sparrow'. /Jack(?=Sparrow|Bauer)/ correspond 'Jack' seulement s'il est suivi de 'Sparrow' ou de 'Bauer'. Cependant, ni 'Sparrow' ni 'Bauer' ne feront partie de la correspondance.

x(?!y)

Correspond 'x' seulement si 'x' n'est pas suivi de 'y'.

Ainsi, /\d+(?!\.)/ correspond un nombre qui n'est pas suivi par un point, cette expression utilise avec la chane 3.141 correspondra pour '141' mais pas pour '3.141'.

(?<=y)x

Correspond x seulement si x est prcd par y. C'est ce qu'on appelle une recherche arrire (lookbehind).

Ainsi /(?<=Jack)Sprat/ correspond "Sprat" seulement s'il est prcd de "Jack".
/(?<=Jack|Tom)Sprat/ correspond "Sprat" seulement s'il est prcd de "Jack" ou "Tom".
Toutefois, "Jack" et "Tom" ne feront pas partie de la correspondance.

(?<!y)x

Correspond x uniquement si x n'est pas prcd par y (parfois appele en anglais negated lookbehind).

Ainsi, /(?<!-)\d+/ correspondra un nombre seulement si celui-ci n'est pas prcd d'un signe moins.
/(?<!-)\d+/.exec('3') cible "3".
/(?<!-)\d+/.exec('-3') ne trouve aucune correspondance car le nombre est prcd d'un signe.

x|y

Correspond 'x' ou 'y'.

Ainsi, /vert|rouge/ correspond 'vert' dans "feu vert" et 'rouge' dans "feu rouge".

{n} Correspond pour exactement n occurences de l'expression prcdente. N doit tre un entier positif.

Ainsi, /a{2}/ ne correspond pas au 'a' de "Mozilla" mais correspond tous les 'a' de "Mozilaa" et aux deux premiers 'a' de "Mozillaaa".
{n,}

Correspond lorsqu'il y a au moins n occurences de l'expression prcdente. n doit tre un entier positif.

Par exemple /a{2,}/ correspondra "aa" ou "aaa" ou encore "aaaa" mais pas "a".

{n,m}

Lorsque n et m sont des entiers positifs, cela correspond au moins n occurences de l'expression prcdente et au plus m occurrences. Lorsque m n'est pas utilis, la valeur par dfaut correspondante sera l'infini.

Ainsi, /a{1,3}/ ne correspond rien dans "Mozill", au 'a' de "Mozilla", au deux premiers 'a' de "Mozillaa" et au trois premiers 'a' de "Mozillaaaaa". Pour ce dernier exemple, on doit noter que le correspondance ne se fait que sur "aaa" bien qu'il y ait plus de 'a' dans la chane de caractres.

[xyz] Un ensemble de caractre. Ce type de motif correspond pour n'importe quel caracttre prsent entre les crochets, y compris les squences d'chappement. Les caractres spciaux comme le point (.) et l'astrisque ne sont pas considrs comme spciaux au sein d'un ensemble et n'ont donc pas besoin d'tre chapps. Il est possible de donner un ensemble sur un intervalle de caractres en utilisant un tiret (-), comme le montre l'exemple qui suit.

Le motif [a-d], aura les mmes correspondances que [abcd], correspondant au 'b' de "bulle" et au 'c' de "ciel". Les motifis /[a-z.]+/ et /[\w.]+/ correspondront pour la chane entirre : "Adre.ss.e".
[^xyz]

Exclusion d'un ensemble de caractres. Cela correspond tout ce qui n'est pas compris entre crochets. Il est possible de fournir un intervalle de caractres en utilisant un tiret (-). Les autres rgles qui s'appliquent pour l'ensemble de caractres (ci-avant) s'appliquent galement ici.

Par exemple, [^abc] est quivalent [^a-c]. Ils correspondent 'u' dans "bulle" et 'i' dans "ciel".

[\b] Correspond pour un retour arrire (U+0008). ( ne pas confondre avec \b.)
\b

Correspond la position d'une limite de mot. Une limite de mot correspond la position o un caractre d'un mot n'est pas suivi ou prcd d'un autre caractre de mot. Il faut savoir que la limite correspondante n'est pas incluse dans le rsultat. Autrement dit, la longueur d'une telle correspondance est nulle. ( ne pas confondre avec [\b].)

Exemples :
/\bm/ correspond au 'm' dans "mignon" ;
/no\b/ ne correspond pas au 'no' de "mignon" car 'no' est suivi de 'n' qui n'est pas un caractre de limite de mot;
/non\b/ correspond au 'non' de "mignon" car 'non' reprsente la fin de la chane de caractre et n'est donc pas suivi par un caractre de mot.
/\w\b\w/ ne correspondra jamais quoi que ce soit car un caractre de mot ne peut pas tre suivi la fois par un caractre de mot et un caractre n'tant pas un caractre de mot.

Note : Le moteur d'expressions rationnelles JavaScript dfinit un ensemble de caractres spcifiques qui doivent tre considrs comme des caractres de mot. Tout caractre qui n'est pas dans cet ensemble est considr comme une limite de mot. Cet ensemble de caractres est relativement limit car constitu uniquement des caractres de l'alphabet romain en minuscules et en majuscules, des chiffres dcimaux et du tiret-bas (underscore). Les autres caractres, comme les caractres accentus ( ou par exemple), sont donc considrs comme des limites de mots.

\B

Correspond une "non-limite de mot". Cela correspond pour les cas suivants :

  • Avant le premier caractre d'une chane de caractres
  • Aprs le dernier caractre d'une chane de caractres
  • Entre deux caractres de mot
  • Entre deux caractres qui ne sont pas des caractres de mot
  • Avec la chane vide.

Ainsi, /\B../ correspond au 'oo' de "football" (et /e\B./ correspond au 'er' dans "une mer "

\cX

tant donn un caractre X compris entre A et Z, cela correspond au caractre de contrle dans une chane de caractres.

Ainsi, /\cM/ correspond au caractre de contrle M (U+000D) d'une chane de caractre.

\d

Correspond un chiffre et est quivalent [0-9].

Ainsi, /\d/ ou /[0-9]/ correspond '2' dans "H2O est la molcule de l'eau".

\D

Correspond tout caractre qui n'est pas un chiffre et est quivalent [^0-9].

Ainsi, /\D/ ou /[^0-9]/ correspond 'H' dans "H2O est la molcule de l'eau".

\f Correspond un saut de page (U+000C).
\n Correspond un saut de ligne (U+000A).
\r Correspond un retour chariot (U+000D).
\s

Correspond un blanc (cela comprend les espace, tabulation, saut de ligne ou saut de page). C'est quivalent [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

Ainsi, /\s\w*/ correspond ' toto' dans "truc toto".

\S

Correspond un caractre qui n'est pas un blanc. C'est quivalent [^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

Ainsi, /\S\w*/ correspond 'truc' dans "truc toto".

\t Correspond une tabulation (U+0009).
\v Correspond une tabulation verticale (U+000B).
\w

Correspond n'importe quel caractre alphanumrique, y compris le tiret bas. C'est quivalent [A-Za-z0-9_].

Ainsi, /\w/ correspond 'l' dans "licorne", '5' dans "5,28", et '3' dans "3D."

\W

Correspond n'importe quel caractre n'tant pas un caractre de mot. Cela est quivalent [^A-Za-z0-9_].

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

\n

Soit n un entier strictement positif, cela fait rfrence au groupe de la n-ime expression entre parenthses (en comptant les parenthses ouvrantes).

Ainsi, /pomme(,)\spoire\1/ correspond 'pomme, poire,' dans "pomme, poire, cerise, pche".

\0 Correspond au caractre NULL (U+0000). Il ne doit pas tre suivi d'un autre chiffre car \0<chiffres> est une squence d'chappement pour les nombres en notation octale (si besoin d'utiliser un chiffre ensuite, on pourra utiliser la forme \x00, cf. ci-aprs).
\xhh Correspond au caractre dont le code hexadcimal est hh (deux chiffres hexadcimaux).
\uhhhh Correspond au caractre dont le code est hhhh (quatre chiffres hexadcimaux).
\u{hhhh} (Uniquement actif quand le marqueur u est activ) Correspond au caractre dont la valeur Unicode est hhhh (en chiffre hexadcimaux).

Afin d'chapper les informations saisies par l'utilisateur et de trater les chanes de caractres pour les utiliser au sein d'un expression rgulire correspondante, il est possible d'utiliser le remplacement suivant :

js
function escapeRegExp(string) {
  // $& correspond  la chane correspondante
  // dans son intgralit
  return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

Le marqueur g situ en fin d'expression permet d'effectuer une recherche globale, qui parcoure toute la chane et renvoie l'ensemble des correspondances trouves (voir Utiliser les marqueurs ci-aprs).

Note : Voir la page sur la mthode String.replace pour plus d'informations.

Utiliser les parenthses

Les parenthses encadrant une partie du motif de l'expression rgulire peuvent tre utilises pour garder en mmoire les correspondances. Cela pourra tre utile pour rutiliser la correspondance trouve.

Ainsi, le motif /Chapitre (\d+)\.\d*/ utilise des caractres chapps et spciaux et indique une partie du motif garder en mmoire. Ce motif correspond aux caractres 'Chapitre ' suivi par un ou plusieurs caractres numriques (\d correspond un chiffre et + indiquant que une srie de 1 ou plusieurs chiffres), suivis par un point (qu'il est ncessaire d'chapper car c'est un caractre spcial, on utilise donc '\' pour indiquer qu'on souhaite reconnatre le caractre '.'), suivi par 0 ou plusieurs chiffres (\d correspondant un chiffre et l'astrisque indiquant que le caractre est prsent 0 ou plusieurs fois). Les parenthses sont utilises pour garder en mmoire les premiers chiffres correspondant.

Ce motif est trouv dans "Ouvrir le Chapitre 4.3 au paragraphe 6" et le chiffre '4' est gard en mmoire. Le motif n'est pas trouv dans "Chapitre 3 et 4", car la chane de caractres ne comporte pas de point aprs le '3'.

Pour qu'une partie de la chane de caractre corresponde mais que la correspondance ne soit pas garde en mmoire, on pourra utiliser ?:. Ainsi, (?:\d+) correspondra pour une squence de chiffres (1 ou plusieurs chiffres) mais on ne gardera pas en mmoire les caractres correspondants.

Utiliser les expressions rationnelles

Les expresssions rgulires sont utilises avec les mthodes test() et exec() de l'objet RegExp et avec les mthodes match(), matchAll(), replace(), replaceAll(), search(), et split(). de l'objet String. Ces mthodes sont expliques en dtail dans la Rfrence JavaScript.

Mthode Description
exec Une mthode de l'objet RegExp qui excute une recherche de correspondance dans une chane de caractres. Elle renvoie un tableau d'informations ou null lorsqu'il n'y a pas de correspondance.
test Une mthode de l'objet RegExp testant la prsence d'une correspondance dans une chane de caractres. Elle renvoie true ou false.
match Une mthode de l'objet String qui excute une recherche de correspondance dans une chane de caractres. Elle renvoie un tableau d'informations ou null lorsqu'il n'y a pas de correspondance.
matchAll Une mthode de l'objet String qui renvoie un itrateur contenant l'ensemble des correspondances, y compris les groupes capturants.
replace Une mthode de l'objet String qui recherche une correspondance dans une chane de caractres et qui remplace la correspondance par une chane de substitution.
replaceAll Une mthode de l'objet String qui recherche toutes les correspondances dans une chane de caractres et qui remplace chaque correspondance par une chane de substitution.
search Une mthode de l'objet String qui teste la prsence d'une correspondance dans une chane de correspondance. Elle renvoie la position de la correspondance ou -1 s'il n'y en a pas.
split Une mthode de l'objet String qui utilise une expression rgulire ou une chane de caractres pour dcouper une chane de caractres en un tableau comprenant les fragments rsultants.

Pour savoir si un motif est prsent au sein d'une chane de caractres, utiliser les mthodes test ou search. Pour obtenir plus d'informations (moins rapidement) on utilisera les mthodes exec ou match. Si on utilise exec ou match et qu'une correspondance est trouve, ces mthodes renverront un tableau et mettront jour des proprits de l'objet global RegExp et aussi de l'instance de RegExp associe l'expression rationnelle. Si aucune correspondance n'est trouve, la mthode exec renverra null (qui est automatiquement converti false lors d'un test conditionnel).

Dans l'exemple qui suit, le script utilise la mthode exec pour trouver une correspondance dans une chane de caractres.

js
var monExpressionReguliere = /d(b+)d/g;
var monTableau = monExpressionReguliere.exec("cdbbdbsbz");

S'il n'est pas ncessaire d'accder aux proprits de l'expression rgulire, une autre faon de rcuprer monTableau peut tre :

js
var monTableau = /d(b+)d/g.exec("cdbbdbsbz");
// quivalent  "cdbbdbsbz".match(/d(b+)d/g);

Si on souhaite construire une expression rgulire partir d'une chane de caractres, on peut utiliser le script suivant :

js
var monExpressionReguliere = new RegExp("d(b+)d", "g");
var monTableau = monExpressionReguliere.exec("cdbbdbsbz");

Avec ces scripts, on obtient bien une correspondance, la mthode renvoie un tableau et met jour les proprits listes dans le tableau qui suit.

Rsultats ds l'excution d'une expression rationnelle.
Objet Proprit ou indice Description Pour cet exemple
monTableau La chane de caractres correspondante et les fragments de chanes gards en mmoire. ["dbbd", "bb"]
index L'indice (dbute partir de 0) de la correspondance, compt dans la chane de caractre initiale. 1
input La chane de caractres initiale. "cdbbdbsbz"
[0] Les derniers caractres qui correspondent. "dbbd"
monExpressionRgulire lastIndex L'indice auquel dbuter la prochaine correspondance. (Cette proprit n'est utilise que si l'expression rgulire utilise l'option g, dcrite dans Effectuer des recherches avances avec les marqueurs . 5
source Le texte du motif, mis jour la cration de l'expression rgulire mais pas lors de son excution. "d(b+)d"

Comme le montre la seconde formulation de cet exemple, il est possible d'utiliser une expression rationnelle, cre avec un objet initialis sans l'affecter une variable. Cela implique qu' chaque utilisation, on aura une nouvelle expression rgulire distincte et qu'on ne pourra pas, pour cette raison, accder aux proprits de l'expression rgulire. Avec le script suivant :

js
var monExpressionReguliere = /d(b+)d/g;
var monTableau = monExpressionReguliere.exec("cdbbdbsbz");
console.log("La valeur de lastIndex est " + monExpressionReguliere.lastIndex);

// "La valeur de lastIndex est 5"

Si le script utilis est :

js
var monTableau = /d(b+)d/g.exec("cdbbdbsbz");
console.log("La valeur de lastIndex est " + /d(b+)d/g.lastIndex);

// "La valeur de lastIndex est 0"

Les occurences de /d(b+)d/g dans les deux instructions sont des objets diffrents. Leurs proprits lastIndex respectives ont donc des valeurs diffrentes. Quand il est ncessaire d'accder aux proprits d'un objet dcrivant une expression rationnelle, il faudra d'abord l'affecter une variable.

Utiliser les correspondances de groupes avec les parenthses

Les parenthses, utilises dans un motif d'expression rgulire, permettent de garder en mmoire un groupe (ou fragment) d'une correspondance. Ainsi, /a(b)c/ correspond aux caractres 'abc' et garde 'b' en mmoire. Pour rcuprer ces fragments mmoriss, on peut utiliser les lments du tableau array [1], ..., [n].

Le nombre de fragments qu'il est possible de garder entre parenthses n'est pas limit. Le tableau renvoy contiendra tout ce qui aura t trouv. Les exemples qui suivent montrent comment utiliser cette syntaxe.

Le script qui suit utilise la mthode replace() pour changer les mots d'une chane de caractres. Pour remplacer le texte, le script utilise $1 et $2 qui correspondent au premier et deuxime groupe correspondant.

js
var re = /(\w+)\s(\w+)/;
var str = "Titi toto";
var newstr = str.replace(re, "$2, $1");
console.log(newstr);

Cela affichera "toto, Titi".

Effectuer des recherches avances en utilisant les marqueurs (flags)

Les expressions rationnelles peuvent tre utilises avec des marqueurs optionnels permettant des recherches globales et/ou ne respectant pas la casse. Ces marqueurs peuvent tre utiliss sparement ou ensemble, quel que soit l'ordre. Ils font partie de l'expression rgulire.

Drapeau (Flag) Description
g Recherche globale
i Recherche ne respectant pas la casse
m Recherche sur plusieurs lignes
s Le point peut correspondre aux caractres de saut de ligne.
u Unicode. Le motif de recherche est interprt comme une squence de codets Unicode.
y Effectue une recherche qui adhre , en partant de la position courante de la chane de caractres sur laquelle la recherche est effectue. Voir la page sur sticky.

Pour utiliser un marqueur avec une expression rgulire, on utilisera la syntaxe suivante :

js
var re = /motif/marqueurs;

ou

js
var re = new RegExp("motif", "marqueurs");

Les marqueurs font partie intgrante d'une expression rgulire, ils ne peuvent pas tre ajouts ou supprims ensuite.

Ainsi, re = /\w+\s/g permet de crer une expression rgulire pour trouver un ou plusieurs caractres suivis d'un espace, la recherche est effectue globalement, sur toute la chane de caractres.

js
var re = /\w+\s/g;
var str = "un deux trois quatre";
var monTableau = str.match(re);
console.log(monTableau);

Cela affichera ["un ", "deux ", "trois "]. On pourrait remplacer la ligne :

js
var re = /\w+\s/g;

avec la ligne :

js
var re = new RegExp("\\w+\\s", "g");

pour obtenir le mme rsultat.

Le comportement du marqueur 'g' est diffrent selon qu'il est utilis avec exec() ou avec match(). Pour match(), c'est la chane de caractres qui invoque la mthode et l'expression rationnelle est alors un argument. Pour exec(), c'est l'expression rationnelle qui invoque la mthode et c'est la chane de caractres qui est passe en argument. Dans l'appel exec(), le marqueur 'g' permet d'avoir une progression itrative.

Le marqueur m pourra tre utilis pour traiter une chane de caractres de plusieurs lignes comme plusieurs lignes distinctes. Si ce marqueur est utilis, les caractres spciaux ^ et $ correspondront au dbut ou la fin de n'importe quelle ligne appartenant la chane de caractres au lieu de correspondre simplement au dbut ou la fin de la chane.

Exemples

Les exemples qui suivent utilisent les expressions rgulires dans diffrents cas.

Changer l'ordre d'une saisie

L'exemple qui suit utilise les expressions rgulires et string.split() et string.replace(). Le script nettoie la chane de caractres saisie qui contient des noms (prnom puis nom) spars par des blancs, tabulations et points-virgules. Enfin il inverse les noms et prnoms puis trie la liste.

js
// La chane des noms contient plusieurs blancs et tabulations,
// il peut y avoir plusieurs espaces entre le nom et le prnom.
var noms = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ";

var output = ["---------- Chane originale\n", noms + "\n"];

// Prparer deux expressions rgulires pour stocker un tableau.
// et dcouper les chanes dans ce tableau.

// motif: on peut avoir des blancs, un point virgule puis d'autres blancs
var motif = /\s*;\s*/;

// Dcouper la chane de caractres en morceaux spars par le prcdent motif
// Stocker ces morceaux dans un tableau listeNoms
var listeNoms = noms.split(motif);

// nouveau motif : un ou plusieurs caractres, des blancs puis des caractres.
// On utilise des parenthses pour garder en mmoire les groupes du motif.
// On utilisera ces groupes par la suite.
motif = /(\w+)\s+(\w+)/;

// Nouveau tableau pour enregistrer les noms traits.
var listeParNomFamille = [];

// Afficher le tableau des noms et remplir le nouveau tableau
// avec les noms et prnoms spars par des virgules, le nom
// de famille tant crit en premier
//
// La mthode replace supprime tout ce qui correspond au motif
// et le remplace par le nom (mmoris), une virgule, un espace
// et le prnom (mmoris).
//
// Les variables $1 et $2 font rfrences aux fragments gards
// en mmoire lors de l'utilisation du motif.

output.push("---------- Aprs dcoupage avec l'expression rgulire");

var i, len;
for (i = 0, len = listeNoms.length; i < len; i++) {
  output.push(listeNoms[i]);
  listeParNomFamille[i] = listeNoms[i].replace(motif, "$2, $1");
}

// Afficher le nouveau tableau
output.push("---------- Noms et prnoms inverss");
for (i = 0, len = listeParNomFamille.length; i < len; i++) {
  output.push(listeParNomFamille[i]);
}

// Trier par le nom de famille puis afficher le tableau tri
listeParNomFamille.sort();
output.push("---------- Trie");
for (i = 0, len = listeParNomFamille.length; i < len; i++) {
  output.push(listeParNomFamille[i]);
}

output.push("---------- Fin");

console.log(output.join("\n"));

Utiliser les caractres spciaux pour vrifier la saisie

Dans l'exemple suivant, on s'attend ce que l'utilisateur saisissent un numro de tlphone. Quand l'utilisateur appuie sur le bouton "Vrifier", le script vrifie la validit du numro. Si le numro est valide (il correspond la squence de caractres fournie par l'expression rgulire), le script affiche un message remerciant l'utilisateur et confirmant le numro. S'il est invalide, le script informe l'utilisateur et lui signifie que les informations saisies ne sont pas valides.

Dans les parenthses sans mmoire (?: , l'expression rgulire cherche les deux premiers chiffres ou l'indicatif du pays suivi d'un blanc et du premier chiffre, ce qui correspond

html
\d{2}|\+\d{2}[ ]\d

Cette partie signifie : deux chiffres OU un signe '+' suivi de deux chiffres, un blanc et un autre chiffre.

Ensuite, on a un groupe qui est mmoris (entre parenthses) :

html
([- ])

Ce groupe correspond ce qui va tre utilis pour sparer les diffrentes composantes du numro de tlphone.

Ensuite,

html
\d{2}\1

signifie qu'on a deux chiffres suivi du premier groupe qui est celui qui dfinit le sparateur. Le reste est compos de la mme faon. Ainsi les numros de tlphone +33 1 23 45 67 89 et 01 23 45 67 89 seront tous les deux valides.

L'vnement Change, provoqu quand l'utilisateur appuie sur Entre, renseigne la valeur RegExp.input.

html
<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <script type="text/javascript">
      var re = /(?:\d{2}|\+\d{2}[ ]\d)([- ])\d{2}\1\d{2}\1\d{2}\1\d{2}/;
      function testInfo(phoneInput) {
        var OK = re.exec(phoneInput.value);
        if (!OK)
          window.alert(
            phone.input + " n'est pas un numro de tlphone valide!",
          );
        else window.alert("Merci, votre numro est : " + OK[0]);
      }
    </script>
  </head>
  <body>
    <p>
      Saisissez votre numro de tlphone (avec indicatif) puis cliquez sur
      "Vrifier". <br />Le format attendu est ## ## ## ## ## ou +## # ## ## ##
      ##.
    </p>
    <form action="#">
      <input id="phone" /><button
        >
        Vrifier
      </button>
    </form>
  </body>
</html>

Web Proxy Viewer  |  New URL  |  Original Page