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
Copy file name to clipboardExpand all lines: 9-regular-expressions/10-regexp-greedy-and-lazy/article.md
+45-45Lines changed: 45 additions & 45 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -70,7 +70,7 @@ Cette description succincte ne vous éclaire peut être pas plus sur la raison d
70
70
71
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.
72
72
73
-
Et s'il y avait des guillemets ici, alors la recherche serait fini, 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 serait finie, 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
@@ -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 luimê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 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"`:
106
106
@@ -144,7 +144,7 @@ Dans cet exemple nous avons vu comment le mode paresseux fonctionne pour `patter
144
144
145
145
**La paresse n'est active que pour le quantificateur suivi de `?`.**
146
146
147
-
Les autres quantificateurs restent glouton.
147
+
Les autres quantificateurs restent gloutons.
148
148
149
149
Par exemple :
150
150
@@ -168,11 +168,11 @@ Mais pour comprendre comment fonctionne les expression régulières et contruire
168
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.
169
169
```
170
170
171
-
## Alternative approach
171
+
## Approche alternative
172
172
173
-
With regexps, there's often more than one way to do the same thing.
173
+
Avec les expressions régulières, Il y a souvent plusieurs façons pour arriver au même résultat.
174
174
175
-
In our case we can find quoted strings without lazy mode using the regexp `pattern:"[^"]+"`:
175
+
Dans notre cas, nous pouvons trouver des chaines de caractères entre guillemets sauf mode paresseux en utilisant la regexp `pattern:"[^"]+"`:
176
176
177
177
```js run
178
178
let regexp =/"[^"]+"/g;
@@ -182,120 +182,120 @@ let str = 'a "witch" and her "broom" is one';
182
182
alert( str.match(regexp) ); // "witch", "broom"
183
183
```
184
184
185
-
The regexp `pattern:"[^"]+"`gives correct results, because it looks for a quote `pattern:'"'`followed by one or more non-quotes `pattern:[^"]`, and then the closing quote.
185
+
La regexp `pattern:"[^"]+"`donne le bon résultat, parce qu'il cherche des guillemets `pattern:'"'`suivis par un ou plusieurs "non-guillemets" `pattern:[^"]`, et ensuite les guillemets de fin.
186
186
187
-
When the regexp engine looks for`pattern:[^"]+`it stops the repetitions when it meets the closing quote, and we're done.
187
+
Quand le moteur de regexp cherche le motif`pattern:[^"]+`il arrête ses répétitions en rencontrant les guillemets suivant, et renvoie la correspondance.
188
188
189
-
Please note, that this logic does not replace lazy quantifiers!
189
+
Mais notez que, que cette logique ne remplace pas les quantificateurs paresseux !
190
190
191
-
It is just different. There are times when we need one or another.
191
+
C'est juste différent. Suivant les cas, nous pourrons avoir besoin de l'un comme de l'autre.
192
192
193
-
**Let's see an example where lazy quantifiers fail and this variant works right.**
193
+
**Examinons un exemple où les quantificateurs paresseux échouent mais cette variante fonctionne.**
194
194
195
-
For instance, we want to find links of the form`<a href="..." class="doc">`, with any`href`.
195
+
Par exemple, nous souhaitons trouver des liens de la forme`<a href="..." class="doc">`, quel que soit le`href`.
196
196
197
-
Which regular expression to use?
197
+
Quelle expression régulière utiliser ?
198
198
199
-
The first idea might be: `pattern:/<a href=".*" class="doc">/g`.
199
+
Une première idée pourrait donner : `pattern:/<a href=".*" class="doc">/g`.
Now it fails. The match includes not just a link, but also a lot of text after it, including`<p...>`.
256
+
Et maintenant ça échoue. La correspondance inclue non seulement le lien, mais aussi beaucoup de text ensuite, incluant`<p...>`.
257
257
258
-
Why?
258
+
Pourquoi ?
259
259
260
-
That's what's going on:
260
+
Voici ce qu'il se passe:
261
261
262
-
1.First the regexp finds a link start`match:<a href="`.
263
-
2.Then it looks for `pattern:.*?`: takes one character (lazily!), check if there's a match for `pattern:" class="doc">` (none).
264
-
3.Then takes another character into `pattern:.*?`, and so on... until it finally reaches`match:" class="doc">`.
262
+
1.Pour commencer la regexp trouve un début de lien`match:<a href="`.
263
+
2.Il cherche ensuite le motif `pattern:.*?`: prend un caractère (mode paresseux !), vérifie s'il a une correspondance pour `pattern:" class="doc">` (aucune).
264
+
3.Puis prend un caractère supplémentaire dans `pattern:.*?`, et ainsi de suite... jusqu'à atteindre finalement`match:" class="doc">`.
265
265
266
-
But the problem is: that's already beyond the link`<a...>`, in another tag `<p>`. Not what we want.
266
+
Mais voilà le problème : c'est déjà au-delà du lien`<a...>`, dans un autre balise `<p>`. Pas vraiment ce que nous souhaitons.
267
267
268
-
Here's the picture of the match aligned with the text:
268
+
Voici le schéma de la correspondance en alignant les caractères :
So, we need the pattern to look for`<a href="...something..." class="doc">`, but both greedy and lazy variants have problems.
275
+
Nous avons donc besoin que le motif recherche`<a href="...something..." class="doc">`, mais les modes, glouton ou paresseux, rencontre des problèmes.
276
276
277
-
The correct variant can be: `pattern:href="[^"]*"`. It will take all characters inside the `href`attribute till the nearest quote, just what we need.
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.
278
278
279
-
A working example:
279
+
Un exemple fonctionnel :
280
280
281
281
```js run
282
282
let str1 ='...<a href="link1" class="wrong">... <p style="" class="doc">...';
283
283
let str2 ='...<a href="link1" class="doc">... <a href="link2" class="doc">...';
284
284
let regexp =/<a href="[^"]*" class="doc">/g;
285
285
286
-
//Works!
287
-
alert( str1.match(regexp) ); // null, no matches, that's correct
286
+
//Ça marche !
287
+
alert( str1.match(regexp) ); // null, aucune corespondance, c'est bien le résultat attendu
: By default the regular expression engine tries to repeat the quantified character as many times as possible. For instance, `pattern:\d+`consumes all possible digits. When it becomes impossible to consume more (no more digits or string end), then it continues to match the rest of the pattern. If there's no match then it decreases the number of repetitions (backtracks) and tries again.
295
+
Glouton
296
+
: 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.
297
297
298
-
Lazy
299
-
: Enabled by the question mark`pattern:?`after the quantifier. The regexp engine tries to match the rest of the pattern before each repetition of the quantified character.
298
+
Paresseux
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é.
300
300
301
-
As we've seen, the lazy mode is not a "panacea" from the greedy search. An alternative is a "fine-tuned" greedy search, with exclusions, as in the pattern`pattern:"[^"]+"`.
301
+
Comme nous l'avons vu, Le mode paresseux n'est pas la "panacée" de la recherche gloutonne. Une alternative est une recherche gloutonne bien dosé, avec des exclusions, comme dans le motif`pattern:"[^"]+"`.
0 commit comments