VIII. Expressions régulières▲
VIII-A. script [regex-01]▲
Dans le cours PHP, nous avions utilisé le code suivant pour illustrer les expressions régulières de PHP 7 :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
<?php
// type strict pour les paramètres de fonctions
declare
(strict_types=
1
);
// expressions régulières en php
// récupérer les différents champs d'une chaîne
// le modèle : une suite de chiffres entourée de caractères quelconques
// on ne veut récupérer que la suite de chiffres
$modèle
=
"/(
\d
+)/"
;
// on confronte la chaîne au modèle
compareModele2Chaine($modèle
,
"xyz1234abcd"
);
compareModele2Chaine($modèle
,
"12 34"
);
compareModele2Chaine($modèle
,
"abcd"
);
// le modèle : une suite de chiffres entourée de caractères quelconques
// on veut la suite de chiffres ainsi que les champs qui suivent et précèdent
$modèle
=
"/^(.*?)(
\d
+)(.*?)$/"
;
// on confronte la chaîne au modèle
compareModele2Chaine($modèle
,
"xyz1234abcd"
);
compareModele2Chaine($modèle
,
"12 34"
);
compareModele2Chaine($modèle
,
"abcd"
);
// le modèle - une date au format jj/mm/aa
$modèle
=
"/^
\s
*(
\d\d
)
\/
(
\d\d
)
\/
(
\d\d
)
\s
*$/"
;
compareModele2Chaine($modèle
,
"10/05/97"
);
compareModele2Chaine($modèle
,
" 04/04/01 "
);
compareModele2Chaine($modèle
,
"5/1/01"
);
// le modèle - un nombre décimal
$modèle
=
"/^
\s
*([+|-]?)
\s
*(
\d
+
\.\d
*|
\.\d
+|
\d
+)
\s
*/"
;
compareModele2Chaine($modèle
,
"187.8"
);
compareModele2Chaine($modèle
,
"-0.6"
);
compareModele2Chaine($modèle
,
"4"
);
compareModele2Chaine($modèle
,
".6"
);
compareModele2Chaine($modèle
,
"4."
);
compareModele2Chaine($modèle
,
" + 4"
);
// fin
exit;
// --------------------------------------------------------------------------
function
compareModele2Chaine(string $modèle
,
string $chaîne
):
void {
// compare la chaîne $chaîne au modèle $modèle
// on confronte la chaîne au modèle
$champs
=
[];
$correspond
=
preg_match($modèle
,
$chaîne
,
$champs
);
// affichage résultats
print
"
\n
Résultats(
$modèle
,
$chaîne
)
\n
"
;
if
($correspond
) {
for
($i
=
0
;
$i
<
count($champs
);
$i
++
) {
print
"champs[
$i
]=
$champs[$i]\n
"
;
}
}
else
{
print
"La chaîne [
$chaîne
] ne correspond pas au modèle [
$modèle
]
\n
"
;
}
}
Nous transposons ce code en Javascript de la façon suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
'use strict'
;
/// expressions régulières en javascript
// récupérer les différents champs d'une chaîne
// le modèle : une suite de chiffres entourée de caractères quelconques
// on ne veut récupérer que la suite de chiffres
let modèle =
/(
\d+
)/;
// on confronte la chaîne au modèle
compareModèleToChaîne
(
modèle,
"xyz1234abcd"
);
compareModèleToChaîne
(
modèle,
"12 34"
);
compareModèleToChaîne
(
modèle,
"abcd"
);
// le modèle : une suite de chiffres entourée de caractères quelconques
// on veut la suite de chiffres ainsi que les champs qui suivent et précèdent
modèle =
/^(.*?
)(
\d+
)(.*?
)$/;
// on confronte la chaîne au modèle
compareModèleToChaîne
(
modèle,
"xyz1234abcd"
);
compareModèleToChaîne
(
modèle,
"12 34"
);
compareModèleToChaîne
(
modèle,
"abcd"
);
// le modèle - une date au format jj/mm/aa
modèle =
/^
\s*(
\d\d)\/(
\d\d)\/(
\d\d)\s*
$/;
compareModèleToChaîne
(
modèle,
"10/05/97"
);
compareModèleToChaîne
(
modèle,
" 04/04/01 "
);
compareModèleToChaîne
(
modèle,
"5/1/01"
);
// le modèle - un nombre décimal
modèle =
/^
\s*([+|-]?
)\s*(
\d+
\.
\d*|
\.
\d+|
\d+
)\s*
$/;
compareModèleToChaîne
(
modèle,
"187.8"
);
compareModèleToChaîne
(
modèle,
"-0.6"
);
compareModèleToChaîne
(
modèle,
"4"
);
compareModèleToChaîne
(
modèle,
".6"
);
compareModèleToChaîne
(
modèle,
"4."
);
compareModèleToChaîne
(
modèle,
" + 4"
);
// --------------------------------------------------------------------------
function compareModèleToChaîne
(
modèle,
chaîne) {
// compare la chaîne [chaîne] au modèle [modèle]
console.log
(
`----------- chaîne=
${chaîne}
, modèle=
${modèle}
`
)
// on confronte la chaîne au modèle
const result1 =
modèle.exec
(
chaîne);
console.log
(
`comparaison avec exec=`
,
result1);
// une autre façon de faire
const result2 =
chaîne.match
(
modèle);
console.log
(
`comparaison avec match=`
,
result2);
}
Commentaires
- les codes PHP et Javascript sont très proches l’un de l’autre ;
- ligne 7 : on notera qu’en Javascript l’expression régulière n’est pas une chaîne de caractères mais un objet. On ne met pas de guillemets ou d’apostrophes autour de l’expression ;
- lignes 41 et 44 : il y a deux méthodes pour obtenir le même résultat ;
Exécution
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\regexp\regexp-01.js"
type d'une expression régulière : object
----------- chaîne=xyz1234abcd, modèle=/(\d+)/
comparaison avec exec= [ '1234',
'1234',
index: 3,
input: 'xyz1234abcd',
groups: undefined ]
comparaison avec match= [ '1234',
'1234',
index: 3,
input: 'xyz1234abcd',
groups: undefined ]
----------- chaîne=12 34, modèle=/(\d+)/
comparaison avec exec= [ '12', '12', index: 0, input: '12 34', groups: undefined ]
comparaison avec match= [ '12', '12', index: 0, input: '12 34', groups: undefined ]
----------- chaîne=abcd, modèle=/(\d+)/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=xyz1234abcd, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= [ 'xyz1234abcd',
'xyz',
'1234',
'abcd',
index: 0,
input: 'xyz1234abcd',
groups: undefined ]
comparaison avec match= [ 'xyz1234abcd',
'xyz',
'1234',
'abcd',
index: 0,
input: 'xyz1234abcd',
groups: undefined ]
----------- chaîne=12 34, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= [ '12 34',
'',
'12',
' 34',
index: 0,
input: '12 34',
groups: undefined ]
comparaison avec match= [ '12 34',
'',
'12',
' 34',
index: 0,
input: '12 34',
groups: undefined ]
----------- chaîne=abcd, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=10/05/97, modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= [ '10/05/97',
'10',
'05',
'97',
index: 0,
input: '10/05/97',
groups: undefined ]
comparaison avec match= [ '10/05/97',
'10',
'05',
'97',
index: 0,
input: '10/05/97',
groups: undefined ]
----------- chaîne= 04/04/01 , modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= [ ' 04/04/01 ',
'04',
'04',
'01',
index: 0,
input: ' 04/04/01 ',
groups: undefined ]
comparaison avec match= [ ' 04/04/01 ',
'04',
'04',
'01',
index: 0,
input: ' 04/04/01 ',
groups: undefined ]
----------- chaîne=5/1/01, modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=187.8, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '187.8',
'',
'187.8',
index: 0,
input: '187.8',
groups: undefined ]
comparaison avec match= [ '187.8',
'',
'187.8',
index: 0,
input: '187.8',
groups: undefined ]
----------- chaîne=-0.6, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '-0.6', '-', '0.6', index: 0, input: '-0.6', groups: undefined ]
comparaison avec match= [ '-0.6', '-', '0.6', index: 0, input: '-0.6', groups: undefined ]
----------- chaîne=4, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '4', '', '4', index: 0, input: '4', groups: undefined ]
comparaison avec match= [ '4', '', '4', index: 0, input: '4', groups: undefined ]
----------- chaîne=.6, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '.6', '', '.6', index: 0, input: '.6', groups: undefined ]
comparaison avec match= [ '.6', '', '.6', index: 0, input: '.6', groups: undefined ]
----------- chaîne=4., modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '4.', '', '4.', index: 0, input: '4.', groups: undefined ]
comparaison avec match= [ '4.', '', '4.', index: 0, input: '4.', groups: undefined ]
----------- chaîne= + 4, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ ' + 4', '+', '4', index: 0, input: ' + 4', groups: undefined ]
comparaison avec match= [ ' + 4', '+', '4', index: 0, input: ' + 4', groups: undefined ]
Les méthodes [regexp.exec] et [string.match] donnent les mêmes résultats :
- [null] s’il n’y a pas de correspondances entre la chaîne et son modèle ;
- un tableau t, s’il y a correspondance avec :
- t[0] : la chaîne correspondant au modèle ;
- t[1] : la chaîne correspondant à la 1ère parenthèse du modèle ;
- t[2] : la chaîne correspondant à la 2ième parenthèse du modèle ;
- …
- t[input] : la chaîne entière dans laquelle on a cherché le modèle ;
VIII-B. script [regexp-02]▲
Parfois on ne souhaite pas récupérer des éléments de la chaîne testée mais seulement savoir si elle correspond au modèle :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
'use strict'
;
/// expressions régulières en javascript
// récupérer les différents champs d'une chaîne
// le modèle : une suite de chiffres entourée de caractères quelconques
// on ne veut récupérer que la suite de chiffres
let modèle =
/
\d+/;
console.log
(
"type d'une expression régulière : "
,
typeof (
modèle));
// on confronte la chaîne au modèle
compareModèleToChaîne
(
modèle,
"xyz1234abcd"
);
compareModèleToChaîne
(
modèle,
"12 34"
);
compareModèleToChaîne
(
modèle,
"abcd"
);
// le modèle : une suite de chiffres entourée de caractères quelconques
// on veut la suite de chiffres ainsi que les champs qui suivent et précèdent
modèle =
/^.*?
\d+.*?
$/;
// on confronte la chaîne au modèle
compareModèleToChaîne
(
modèle,
"xyz1234abcd"
);
compareModèleToChaîne
(
modèle,
"12 34"
);
compareModèleToChaîne
(
modèle,
"abcd"
);
// le modèle - une date au format jj/mm/aa
modèle =
/^
\s*
\d\d\/
\d\d\/
\d\d\s*
$/;
compareModèleToChaîne
(
modèle,
"10/05/97"
);
compareModèleToChaîne
(
modèle,
" 04/04/01 "
);
compareModèleToChaîne
(
modèle,
"5/1/01"
);
// le modèle - un nombre décimal
modèle =
/^
\s*[+|-]?
\s*
\d+
\.
\d*|
\.
\d+|
\d+
\s*
$/;
compareModèleToChaîne
(
modèle,
"187.8"
);
compareModèleToChaîne
(
modèle,
"-0.6"
);
compareModèleToChaîne
(
modèle,
"4"
);
compareModèleToChaîne
(
modèle,
".6"
);
compareModèleToChaîne
(
modèle,
"4."
);
compareModèleToChaîne
(
modèle,
" + 4"
);
// --------------------------------------------------------------------------
function compareModèleToChaîne
(
modèle,
chaîne) {
// test
const correspond =
modèle.test
(
chaîne);
// compare la chaîne [chaîne] au modèle [modèle]
console.log
(
`----------- chaîne=
${chaîne}
, modèle=
${modèle}
, correspond=
${correspond}
`
);
}
Commentaires
- [regexp-02] reprend le code de [regexp-01] avec les différences suivantes :
- on ne souhaite pas récupérer des éléments de la chaîne testée. Aussi a-t-on enlevé les parenthèses dans les expressions régulières utilisées ;
- ligne 40 : on utilise la méthode [Regexp.test] pour savoir si une chaîne de caractères vérifie une expression régulière ;
Les résultats de l’exécution sont les suivants :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\cours\regexp\regexp-02.js"
type d'une expression régulière : object
----------- chaîne=xyz1234abcd, modèle=/\d+/, correspond=true
----------- chaîne=12 34, modèle=/\d+/, correspond=true
----------- chaîne=abcd, modèle=/\d+/, correspond=false
----------- chaîne=xyz1234abcd, modèle=/^.*?\d+.*?$/, correspond=true
----------- chaîne=12 34, modèle=/^.*?\d+.*?$/, correspond=true
----------- chaîne=abcd, modèle=/^.*?\d+.*?$/, correspond=false
----------- chaîne=10/05/97, modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=true
----------- chaîne= 04/04/01 , modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=true
----------- chaîne=5/1/01, modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=false
----------- chaîne=187.8, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=-0.6, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=4, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=.6, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=4., modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne= + 4, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
[Done] exited with code=0 in 0.269 seconds