You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Pour simplifier un peu, nous considérons ici qu'une balise ne peut pas contenir de `<` ou `>` (même à l'intérieur de guillemets), that simplifies things a bit.
15
+
Pour simplifier un peu, nous considérons ici qu'une balise ne peut pas contenir de `<` ou `>` (même à l'intérieur de guillemets).
Copy file name to clipboardExpand all lines: 9-regular-expressions/10-regexp-greedy-and-lazy/article.md
+27-27Lines changed: 27 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
# Quantificateur glouton ou paresseux
1
+
# Quantificateurs gloutons ou paresseux
2
2
3
3
Les quantificateurs, à première vue, très simples, peuvent parfois être retors.
4
4
@@ -14,7 +14,7 @@ La première chose à faire est de trouver ces guillemets droits, et nous pourro
14
14
15
15
Une expression régulière comme `pattern:/".+"/g` (des guillemets, puis quelque chose, puis d'autres guillemets) semble être une bonne approche, mais pas exactement !
16
16
17
-
Essayons ça:
17
+
Testons cela :
18
18
19
19
```js run
20
20
let regexp =/".+"/g;
@@ -28,49 +28,49 @@ alert( str.match(regexp) ); // "witch" and her "broom"
28
28
29
29
Au lieu de trouver deux correspondances `match:"witch"` et `match:"broom"`, il n'en trouve qu'une : `match:"witch" and her "broom"`.
30
30
31
-
Qui peut être vu comme "La cupidité est à la racine de tous les ennuis".
31
+
Ce qui peut être vu comme "La gourmandise est un défaut qui cause beaucoup de torts à ceux qui s’y livrent".
32
32
33
33
## Recherche gloutonne
34
34
35
35
Pour trouver une correspondance, le moteur d'expression régulière utilise l'algorithme suivant :
36
36
37
37
- Pour chacune des positions de la chaîne de caractère
38
38
- Essaye de trouver le motif à cette position.
39
-
-S'il n'y a pas de correspondance, va à la prochaine position.
39
+
-Si aucune correspondance, va à la prochaine position.
40
40
41
-
Cette description succincte ne vous éclaire peutêtre pas plus sur la raison de l'échec de la recherche précédente, alors voyons plus en détail comment se déroule la recherche du motif `pattern:".+"`.
41
+
Cette description succincte ne suffit peut-être pas à mettre en évidence l'échec précédent, alors voyons plus en détail comment se déroule la recherche du motif `pattern:".+"`.
42
42
43
-
1.le premier caractère du motif sont des guillemets droits `pattern:"`.
43
+
1.Le premier caractère du motif sont des guillemets droits `pattern:"`.
44
44
45
-
le moteur d'expressions régulières essaye de les trouver à la position zéro de la chaîne originale`subject:a "witch" and her "broom" is one`, mais comme il y a un `subject:a` à cette place, il n'y a pas de correspondance possible.
45
+
Le moteur d'expression régulière essaye de les trouver à la position zéro de la chaîne source`subject:a "witch" and her "broom" is one`, mais comme il y a un `subject:a` à cette place, il n'y a pas de correspondance possible.
46
46
47
47
Puis il avance : va aux positions suivantes dans la chaîne source et essaye d'y trouver le premier caractère du motif, il échoue une nouvelle fois, avant de trouver les guillemets en troisième position :
48
48
49
49

50
50
51
-
2. Les premiers guillemets trouvé, le moteur essaye de trouver la correspondance pour la suite du motif. Il essaye de voir si le reste de la chaîne suit le motif `pattern:.+"`.
51
+
2. Les premiers guillemets trouvés, le moteur essaye de trouver la correspondance pour la suite du motif. Il essaye de voir si le reste de la chaîne suit le motif `pattern:.+"`.
52
52
53
-
Dans notre cas le caractère suivant dans le motif est `pattern:.` (un point). Il signifie "tout caractère, nouvelle ligne exceptée", la lettre suivante de la chaîne `match:'w'`marche :
53
+
Dans notre cas le caractère suivant dans le motif est `pattern:.` (un point). Il signifie "tout caractère, nouvelle ligne exceptée", la lettre suivante de la chaîne `match:'w'`correspond bien :
54
54
55
55

56
56
57
57
3. Le point est alors répété avec le quantificateur `pattern:.+`. le moteur d'expression régulière ajoute à la correspondance, les caractères les uns à la suite des autres.
58
58
59
-
... Jusqu'à quand ? Tout caractère correspond au point, il ne s'arrête qu'une fois arrivé à la fin de chaîne :
59
+
... Jusqu'à quand ? Comme tout caractère correspond au point, il ne s'arrête qu'une fois arrivé à la fin de chaîne :
60
60
61
61

62
62
63
63
4. La répétition du motif `pattern:.+` maintenant finie, il essaye de trouver le caractère suivant. Ce sont des guillemets droits `pattern:"`. Mais problème : arrivé en bout de chaîne, il n'y a plus de caractère !
64
64
65
-
Le moteur d'expressions régulières comprend qu'il a pris trop de `pattern:.+` et commence à revenir sur ses pas.
65
+
Le moteur d'expression régulière comprend qu'il a pris trop de `pattern:.+` et commence à revenir sur ses pas.
66
66
67
67
En d'autres termes, il réduit la correspondance avec le quantificateur d'un caractère :
68
68
69
69

70
70
71
-
Il considère maintenant que `pattern:.+`finit un caractère avant la fin de chaîne et essaye de la trouver la fin du motif à partir de cette position.
71
+
Il considère maintenant que `pattern:.+`se termine un caractère avant la fin de la chaîne et essaye de la trouver la fin du motif à partir de cette position.
72
72
73
-
Et s'il y avait des guillemets ici, alors la recherche serait finie, mais le dernier caractère est `subject:'e'`, il n'y a donc toujours pas de correspondance.
73
+
Et s'il y avait des guillemets ici, alors la recherche s'arrêterait, mais le dernier caractère est `subject:'e'`, il n'y a donc toujours pas de correspondance.
74
74
75
75
5. ... Le moteur d'expression régulière diminue encore le nombre de répétitions de `pattern:.+` d'un autre caractère :
76
76
@@ -82,11 +82,11 @@ Cette description succincte ne vous éclaire peut être pas plus sur la raison d
82
82
83
83

84
84
85
-
7. La correspondance avec motif est complète.
85
+
7. La correspondance au motif est complète.
86
86
87
-
8. La première correspondance est donc `match:"witch" and her "broom"`. Si l'expression régulière porte le marqueur `pattern:g`, alors la recherche continuera à partir de la fin de la première correspondance. Comme il n'y a plus de guillemets dans la suite de la chaîne `subject:is one`, il n'y pas d'autres correspondance.
87
+
8. La première correspondance est donc `match:"witch" and her "broom"`. Si l'expression régulière porte le marqueur `pattern:g`, alors la recherche continuera à partir de la fin de cette première correspondance. Comme il n'y a plus de guillemets dans la suite de la chaîne `subject:is one`, il n'y pas d'autres correspondances.
88
88
89
-
Ce n'est peut-être pas ce que nous attendions, mais c'est ainsi que cela fonctionne.
89
+
Ce n'est peut-être pas ce que nous attendions, mais c'est bien ainsi que cela fonctionne.
90
90
91
91
**En mode glouton (mode par défaut) un caractère suivi d'un quantificateur est répété autant de fois que possible.**
92
92
@@ -100,7 +100,7 @@ Le mode paresseux des quantificateurs est l'opposé du mode glouton. Il signifie
100
100
101
101
Nous pouvons l'activer en ajoutant un `pattern:'?'` après le quantificateur, il devient alors `pattern:*?` ou `pattern:+?` ou encore `pattern:??` pour le `pattern:'?'`.
102
102
103
-
Pour clarifier les choses : le point d'interrogation `pattern:?` est en général un quantificateur (zero ou un), mais si nous l'ajoutons *à la suite d'un autre quantificateur (ou bien lui-même)* il prend une autre signification -- il change le mode de correspondance de glouton à paresseux.
103
+
Pour clarifier les choses : le point d'interrogation `pattern:?` est en général un quantificateur (zero ou un), mais si nous l'ajoutons *à la suite d'un autre quantificateur (ou bien de lui-même)* il prend une autre signification -- il change le mode de correspondance de glouton à paresseux.
104
104
105
105
La regexp `pattern:/".+?"/g` fonctionne alors comme prévu : elle trouve `match:"witch"` et `match:"broom"`:
Le mode paresseux ne répète rien sans en avoir besoin. Le motif est terminé, donc la recherche aussi. Nous avons une correspondance `match:123 4`.
162
162
163
163
```smart header="Optimisations"
164
-
Les moteurs d'expressions régulières récents arrive à optimiser leurs algorithmes internes. Ils fonctionnent donc un peu différemment.
164
+
Les moteurs d'expression régulière récents arrive à optimiser leurs algorithmes internes. Ils fonctionnent donc un peu différemment.
165
165
166
-
Mais pour comprendre comment fonctionne les expression régulières et contruire des expressions régulière, nous n'avons pas besoin d'en savoir plus. Ils sont seulement utilisé en interne pour optimiser les choses.
166
+
Mais pour comprendre comment fonctionnent les expression régulières et pour en contruire, nous n'avons pas besoin d'en savoir plus. Ils sont seulement utilisé en interne pour optimiser les choses.
167
167
168
-
Comme les expressions régulières complexes sont sont difficiles à optimiser, la recherche peut se dérouler exactement comme nous l'avons décri.
168
+
Comme les expressions régulières complexes sont difficiles à optimiser, la recherche peut se dérouler exactement comme nous l'avons décri.
169
169
```
170
170
171
171
## Approche alternative
172
172
173
173
Avec les expressions régulières, Il y a souvent plusieurs façons pour arriver au même résultat.
174
174
175
-
Dans notre cas, nous pouvons trouver des chaines de caractères entre guillemets sauf mode paresseux en utilisant la regexp `pattern:"[^"]+"`:
175
+
Dans notre cas, nous pouvons trouver des chaines de caractères entre guillemets sans mode paresseux en utilisant la regexp `pattern:"[^"]+"`:
176
176
177
177
```js run
178
178
let regexp =/"[^"]+"/g;
@@ -253,7 +253,7 @@ let regexp = /<a href=".*?" class="doc">/g;
Nous avons donc besoin que le motif recherche `<a href="...something..." class="doc">`, mais les modes, glouton ou paresseux, rencontre des problèmes.
275
+
Nous avons donc besoin que le motif recherche `<a href="...something..." class="doc">`, mais les modes, glouton ou paresseux, rencontrent des problèmes.
276
276
277
277
Une alternative fonctionnelle peut être : `pattern:href="[^"]*"`. Cela prendra tous les caractères à l'intérieur de l'attribut `href` jusqu'aux prochains guillemets, juste ce qu'il faut.
: Par défaut le moteur d'expressions régulières essaye de répéter le caractère quantifié autant de fois que possible. Par exemple, `pattern:\d+` consomme tous les chiffres possibles. Quand il devient impossible d'en consommer d'autre (plus de chiffre ou fin de chaîne), il continue alors pour trouver la fin du motif. S'il ne trouve pas de correspondance il réduit alors le nombre de répétitions effectuées (il revient sur ses pas) et essaye à nouveau.
296
+
: Par défaut le moteur d'expression régulière essaye de répéter le caractère quantifié autant de fois que possible. Par exemple, `pattern:\d+` consomme tous les chiffres possibles. Quand il devient impossible d'en consommer d'autre (plus aucun chiffre ou fin de chaîne), il continue alors pour trouver la fin du motif. S'il ne trouve pas de correspondance, il réduit alors le nombre de répétitions effectuées (il revient sur ses pas) et essaye à nouveau.
297
297
298
298
Paresseux
299
299
: Activé par le point d'interrogation `pattern:?` après le quantificateur. Le moteur de regexp essaye de trouver une correspondance pour le reste du motif avant chaque répétition du caractère quantifié.
0 commit comments