Vous êtes sur la page 1sur 23

R e g E xp – Expressions Régulières

J AVA S C R I P T (Programmation Internet) VO L . X

J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga


+243 - 851278216 - 899508675 - 991239212 - 902263541 - 813572818

CHAPITRE 17 : Les Expressions régulières (RegExp) :

L’objet RegExp décrit un modèle de chaîne de caractères à utiliser dans


une expression régulière. Les Expressions Régulières servent à une
comparaison (pattern-matching) et la recherche & remplacement
("search-and-replace") sur du texte.

Syntaxe :

/modele/modificateurs;

Exemple :

var regexp = /model/ig

Les Modificateurs :

Modifient le mode de l’opération :

Modificateur Action
i Respect de la case :
i = casse insensible,
par défaut = casse sensible.
g Recherche globale (sur toute la chaîne, pas seulement la
première occurrence = global search).
m Correspondance (match) multiligne.
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

Parenthèses et Crochets = [square] Brackets dans le modèle :

Ils spécifient une étendue (rangée) de caractères :

Signification des Expressions dans les Crochets :

Expression Signification

[abc] Toute lettre d’alphabet contenue entre les crochets.


[^abc] Toute lettre d’alphabet autre que celles entre les crochets.
[0-9] N’importe quel chiffre (digit) décimal dans l’étendue spécifié
dans les crochets, les bornes comprises.
[^0-9] Tout chiffre en dehors de la rangée spécifiée les bornes in-
cluses
(abc) La chaîne exacte spécifiée.

Exemple manipulation de dates :

<script type="text/javascript"> "use strict";


let reDate = /([0-9]{4})-([0-9]{2})-([0-9]{2})/,
match = reDate.exec('2020-12-31'),
an = match[1],
mois = match[2],
jour = match[3],
jourx = match[4];

console.log(reDate);
console.log(match);
console.log(jour);
console.log(mois);
console.log(an);
console.log(jourx);
</script>

RegExp - 2 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

ou, pour éviter l’indexation,

<script type="text/javascript"> "use strict";


const
reDate = /(?<an>[0-9]{4})-(?<mois>[0-9]{2})-
(?<jour>[0-9]{2})/,
date = '2018-04-30',
match = reDate.exec(date),
an = match.groups.an, // 2018
mois = match.groups.mois, // 04
jour = match.groups.jour; // 30

console.log(reDate);
console.log(match);
console.log(jour);

RegExp - 3 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log(mois);
console.log(an);

console.log(
date.replace(reDate, '$<jour>-$<mois>-$<an>')
); // Changement format de date.
</script>

Avec Yandex (ça ne marche pas avec Firefox Quantum 62.0.2) :

Firefox :

RegExp - 4 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
LookAhead :

Par exemple, comment extraire le sigle monétaire dans un prix :

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(?=\d+)/,
match = reLookahead.exec('Roubles123.45');

console.log( "match =",match );


console.log( `match["index"] = ${match["index"]}` );
console.log( 'match["length"] =',match["length"] );
console.log( "match.length =",match.length );
console.log( "match['input'] =",match['input'] );
console.log( "match[0] =",match[0] );

console.log( match[1] );
</script>

Bien satisfaits ? Voyons les variantes suivantes :

Tous les nombres :

RegExp - 5 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
<script type="text/javascript"> "use strict";
const
reLookahead = /\D+(\d+.)+(\d+.)+(\d+.)+(\d+.)+/,
match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log( "match =",match );


// match = Array(5) [
// "Mon IP : 123.45.73.255", "123.", "45.", "73.", "255"
// ]

console.log( `match["index"] = ${match["index"]}` );


// match["index"] = 0

console.log( 'match["length"] =',match["length"] );


// match["length"] = 5

console.log( "match.length =",match.length );


// match.length = 5

console.log( "match['input'] =",match['input'] );


// match['input'] = Mon IP : 123.45.73.255

console.log( "match[0] =",match[0] );


// match[0] = Mon IP : 123.45.73.255

console.log( "match[1] =",match[1] ); // match[1] = 123.


console.log( "match[2] =",match[2] ); // match[2] = 45.
console.log( "match[3] =",match[3] ); // match[3] = 73.
console.log( "match[4] =",match[4] ); // match[4] = 255

console.log( "match[5] =",match[5] );


// match[5] = undefined
</script>

Le dernier nombre :

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(\d+.)+/,
match = reLookahead.exec(
'Mon IP : 123.45.73.255');

RegExp - 6 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log("match =",match);
// match =
// Array [ "Mon IP : 123.45.73.255", "255" ]

console.log(`match["index"] = ${match["index"]}`);
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 123.45.73.255

console.log("match[1] =",match[1]); // match[1] = 255

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

Le premier nombre :

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(\d+)/,
match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log("match =",match);
// match =
// Array [ "Mon IP : 123.45.73.255", "255" ]

console.log(`match["index"] = ${match["index"]}`);
RegExp - 7 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 123.45.73.255

console.log("match[1] =",match[1]); // match[1] = 255

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(.\d+)/,

match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log("match =",match);
// match =
// Array [ "Mon IP : 123", "123" ]

console.log(`match["index"] = ${match["index"]}`);
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

RegExp - 8 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 123

console.log("match[1] =",match[1]); // match[1] = 123

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(\d+).+/,

match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log("match =",match);
// match =
// Array [ "Mon IP : 123", "123" ]

console.log(`match["index"] = ${match["index"]}`);
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255
RegExp - 9 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 123

console.log("match[1] =",match[1]); // match[1] = 123

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

Les vicissitudes, trapes, caprices…

<script type="text/javascript"> "use strict";


const
// reLookahead = /\D+(\.d+)/, // Err

// reLookahead = /\D+.(.\d+)/, // ou
reLookahead = /\D+.(\d{3})+/,

match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log("match =",match);
// match =
// Array [ "Mon IP : 123", "23" ]

console.log(`match["index"] = ${match["index"]}`);
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255
RegExp - 10 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 123

console.log("match[1] =",match[1]);
// match[1] = 123

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

vs

<script type="text/javascript"> "use strict";


const
// reLookahead = /\D+(\.d+)/, // Err

// reLookahead = /\D+.(.\d+)/, // ou
reLookahead = /\D+.(\d+)+/,

match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log("match =",match);
// match =
// Array [ "Mon IP : 123", "23" ]

console.log(`match["index"] = ${match["index"]}`);
// match["index"] = 0

console.log('match["length"] =',match["length"]);
// match["length"] = 2

console.log("match.length =",match.length);
// match.length = 2

console.log("match['input'] =",match['input']);
// match['input'] = Mon IP : 123.45.73.255
RegExp - 11 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

console.log("match[0] =",match[0]);
// match[0] = Mon IP : 23

console.log("match[1] =",match[1]);
// match[1] = 23

console.log("match[2] =",match[2]);
// match[2] = undefined
console.log("match[3] =",match[3]);
// match[3] = undefined
console.log("match[4] =",match[4]);
// match[4] = undefined
console.log("match[5] =",match[5]);
// match[5] = undefined
</script>

<script type="text/javascript"> "use strict";


const
reLookahead = /\D+(\d+)(\d+)(\d+)/,
match = reLookahead.exec(
'Mon IP : 123.45.73.255');

console.log( "match =",match );


// match = Array(5) [
// "Mon IP : 123.45.73.255", "123.", "45.", "73.", "255"
// ]

console.log( `match["index"] = ${match["index"]}` );


// match["index"] = 0

console.log( 'match["length"] =',match["length"] );


// match["length"] = 4

console.log( "match.length =",match.length );


// match.length = 4

console.log( "match['input'] =",match['input'] );


// match['input'] = Mon IP : 123.45.73.255

console.log( "match[0] =",match[0] );


// match[0] = Mon IP : 123

RegExp - 12 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log( "match[1] =",match[1] ); // match[1] = 1
console.log( "match[2] =",match[2] ); // match[2] = 2
console.log( "match[3] =",match[3] ); // match[3] = 3

console.log( "match[4] =",match[4] );


// match[4] = undefined

console.log( "match[5] =",match[5] );


// match[5] = undefined
</script>

LookBehind :

Par exemple, extraire le prix sans le sigle monétaire : Sautez les non-
digits et prendre les premiers digits avant d’autres non-digits. À ne pas
confondre avec un éventuel « LookReverse », ici c’est « sauter » : « re-
garder après… » ou « lookPast… ».

LookBehind positif : Positive lookbehind assertion :


Un non-digit DOIT exister :

<script type="text/javascript"> "use strict";


const
reLookbehind = /(?<=\D)\d+.\d+.\d+.\d+/,
match = reLookbehind.exec('Mon IP : 123.45.73.255');

console.log( "match =",match );


console.log( `match["index"] = ${match["index"]}` );
console.log( 'match["length"] =',match["length"] );
console.log( "match.length =",match.length );
console.log( "match['input'] =",match['input'] );
console.log( "match[0] =",match[0] );

console.log( match[1] );
</script>

Avec Yandex Version 18.11.1.385 beta :

RegExp - 13 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

Firefox Quantum 62.0.2 n’a pas cette fonctionnalité !

LookBehind négatif : Negative lookbehind assertion :


Une valeur NE DOIT PAS exister :

<script type="text/javascript"> "use strict";


const
reLookbehindNeg = /(?<!\Di)\d+.\d+.\d+.\d+/,
match = reLookbehindNeg.exec(
'Mon IP : 123.45.73.255');

console.log( "match =",match ); // $


console.log( `match["index"] = ${match["index"]}` ); // $
console.log( 'match["length"] =',match["length"] ); // $

RegExp - 14 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log( "match.length =",match.length ); // $
console.log( "match['input'] =",match['input'] ); // $
console.log( "match[0] =",match[0] ); // $

console.log( match[1] ); // $
</script>

« Parser » le IP :

<script type="text/javascript"> "use strict";


const
reLookaheadNeg = /\D+(\d+).(\d+).(\d+).(\d+)/,
match = reLookaheadNeg.exec(
'Mon IP : 123.45.73.255');

console.log( "match =",match );


console.log( `match["index"] = ${match["index"]}` );
console.log( 'match["length"] =',match["length"] );

RegExp - 15 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
console.log( "match.length =",match.length );
console.log( "match['input'] =",match['input'] );

console.log( "match[0] =",match[0] );


console.log( "match[1] =",match[1] );
console.log( "match[2] =",match[2] );
console.log( "match[3] =",match[3] );
console.log( "match[4] =",match[4] );
console.log( "match[5] =",match[5] );
</script>

RegExp - 16 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

RegExp - 17 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X

Les Métacaractères :

Caractères spéciaux (ayant signification spéciale) :

Métacaractère Représente (correspond à, recherche)

. Un seul caractère à part « saut de ligne » (newline) ou « fin


(point, dot, de ligne » (line terminator).
period)
\0 Caractère NUL
\b Correspondance au début/fin d’un Mot
\B Correspondance pas au début/fin d’un Mot
\d Chiffre (digit) décimal
\D Pas un chiffre (non-digit) décimal
\f Caractère « form feed »
(avancement feuille).
\n Caractère « new line »
(Avancement ligne)
\r Caractère « carriage return »
(Retour chariot)
\s Caractère « White space »
Barre d’espacement
\S Tout caractère autre que l’espace
(non-whitespace character)
\t « tab character »
(Caractère de tabulation)
\uxxxx Caractère Unicode spécifié, en Hexadécimal xxxx
\v « vertical tab character »
(tabulation verticale)
\w Mot (word character)
RegExp - 18 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
\W Non-mot (non-word character)
\xxx Caractère spécifié par le nombre octal xxx
\xdd Caractère spécifié par le nombre hexadécimal dd

Les Quantificateurs (facteurs d’itération) :

Itérateur Signification

n+ Toute chaîne contenant au moins 1 n


n* Toute chaîne contenant zéro ou plusieurs (un nombre quel-
conque d’) occurrences de n
n? Toute chaîne contenant zéro ou UNE (tout au plus UNE) occur-
rences de n
n{X} Toute chaîne contenant une séquence de X n
n{X,Y} Chaîne contenant une séquence de X à Y n
n{X,} Toute chaîne contenant une séquence d’au moins X n
n$ Toute chaîne se terminant par n
^n Toute chaîne commençant par n
?=n Toute chaîne suivie de la chaîne n spécifiée
?!n Toute chaîne non suivie de la chaîne n spécifiée

Propriétés de l’Object RegExp :

Propriété Description

constructor Renvoie la fonction qui a créé le prototype de l’objet RegExp


global Vérifie si le modificateur « g » est activé
ignoreCase Vérifie si le modificateur « i »" est activé
RegExp - 19 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
lastIndex Dernier index à partir duquel démarrer la prochaine comparai-
son
multiline Vérifie si le modificateur « m » est activé

source Renvoie le texte (ou chaîne) du modèle (ou pattern) RegExp

Méthodes de l’objet RegExp :

Méthode Description
compile() Compile une expression régulière (Dépréciée dans la version 1.5).
exec() Teste un match dans une chaîne. Renvoie le premier match
test() Teste un match dans une chaîne. Renvoie true ou false
toString() Renvoie la valeur de la chaîne de l’expression régulière

Propriétés de RegExp :

<script>
console.log(RegExp.prototype);
</script>

Exécution :

1 {constructor: ƒ, exec: ƒ, …}
A compile:ƒ compile()
B constructor:ƒ RegExp()
C dotAll:(...)
D exec:ƒ exec()
E flags:(...)
F global:(...)
G ignoreCase:(...)
H multiline:(...)
I source:(...)
RegExp - 20 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
J sticky:(...)
K test:ƒ test()
L toString:ƒ toString()
M unicode:(...)
N Symbol(Symbol.match):ƒ [Symbol.match]()
O Symbol(Symbol.replace):ƒ [Symbol.replace]()
P Symbol(Symbol.search):ƒ [Symbol.search]()
Q Symbol(Symbol.split):ƒ [Symbol.split]()
R get dotAll:ƒ dotAll()
S get flags:ƒ flags()
T get global:ƒ global()
U get ignoreCase:ƒ ignoreCase()
V get multiline:ƒ multiline()
W get source:ƒ source()
X get sticky:ƒ sticky()
Y get unicode:ƒ unicode()
Z __proto__:Object

Propriétés de RegExp avec


Object . getOwnPropertyNames ( RegExp ) :

Array [ "input", "lastMatch", "lastParen", "leftContext",


"rightContext", "$1", "$2", "$3", "$4", "$5", … ]

0: "input"
1: "lastMatch"
2: "lastParen"
3: "leftContext"
4: "rightContext"
5: "$1"
6: "$2"
7: "$3"
8: "$4"
9: "$5"
10: "$6"
11: "$7"
12: "$8"
13: "$9"
14: "$_"
15: "$&"
16: "$+"
17: "$`"
RegExp - 21 / 23 - jeudi, 20. décembre 2018 (10:05 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
18: "$'"
19: "prototype"
20: "length"
21: "name"
length: 22
__proto__: Array []

Propriétés de RegExp avec For(i in RegExp) :


input.
lastMatch. undefined
lastParen.
leftContext.
rightContext.
$1.
$2.
$3.
$4.
$5.
$6.
$7.
$8.
$9.

Mots-clés :

RegExp, modèle de chaîne, expression régulière, Expressions Régu-


lières, comparaison, pattern-matching, recherche, remplacement, search-
and-replace, Métacaractères,Caractères spéciaux

jeudi, 20. décembre 2018 (10:05 ).

DIASOLUKA Nz. Luyalu


Docteur en Médecine, Chirurgie & Accouchements (1977),
CNOM : 0866 - Spécialiste en ophtalmologie (1980)
Informaticien-amateur, Programmeur et WebMaster.

RegExp - 22 / 23 - jeudi, 20. décembre 2018 (10:05 )


J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-X
Chercheur indépendant, autonome et autofinancé, bénévole,
sans aucun conflit d’intérêt ou liens d'intérêts ou contrainte
promotionnelle avec qui qu’il soit ou quelqu’organisme ou
institution / organisation que ce soit, étatique, paraétatique ou
privé, industriel ou commercial en relation avec le sujet
présenté.

+243 - 851278216 - 899508675 - 995624714 - 902263541 - 813572818

diasfb@mail2world.com

RegExp - 23 / 23 - jeudi, 20. décembre 2018 (10:05 )

Vous aimerez peut-être aussi