Skip to content

Commit c5985d8

Browse files
committed
Alternative&Summary, first pass
1 parent af5e7f7 commit c5985d8

File tree

1 file changed

+45
-45
lines changed
  • 9-regular-expressions/10-regexp-greedy-and-lazy

1 file changed

+45
-45
lines changed

9-regular-expressions/10-regexp-greedy-and-lazy/article.md

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Cette description succincte ne vous éclaire peut être pas plus sur la raison d
7070

7171
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.
7272

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.
7474

7575
5. ... Le moteur d'expression régulière diminue encore le nombre de répétitions de `pattern:.+` d'un autre caractère :
7676

@@ -100,7 +100,7 @@ Le mode paresseux des quantificateurs est l'opposé du mode glouton. Il signifie
100100

101101
Nous pouvons l'activer en ajoutant un `pattern:'?'` après le quantificateur, il devient alors `pattern:*?` ou `pattern:+?` ou encore `pattern:??` pour le `pattern:'?'`.
102102

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 lui-même)* il prend une autre signification -- il change le mode de correspondance de glouton à paresseux.
104104

105105
La regexp `pattern:/".+?"/g` fonctionne alors comme prévu : elle trouve `match:"witch"` et `match:"broom"`:
106106

@@ -144,7 +144,7 @@ Dans cet exemple nous avons vu comment le mode paresseux fonctionne pour `patter
144144

145145
**La paresse n'est active que pour le quantificateur suivi de `?`.**
146146

147-
Les autres quantificateurs restent glouton.
147+
Les autres quantificateurs restent gloutons.
148148

149149
Par exemple :
150150

@@ -168,11 +168,11 @@ Mais pour comprendre comment fonctionne les expression régulières et contruire
168168
Comme les expressions régulières complexes sont sont difficiles à optimiser, la recherche peut se dérouler exactement comme nous l'avons décri.
169169
```
170170

171-
## Alternative approach
171+
## Approche alternative
172172

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.
174174

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:"[^"]+"`:
176176

177177
```js run
178178
let regexp = /"[^"]+"/g;
@@ -182,120 +182,120 @@ let str = 'a "witch" and her "broom" is one';
182182
alert( str.match(regexp) ); // "witch", "broom"
183183
```
184184

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.
186186

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.
188188

189-
Please note, that this logic does not replace lazy quantifiers!
189+
Mais notez que, que cette logique ne remplace pas les quantificateurs paresseux !
190190

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.
192192

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.**
194194

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`.
196196

197-
Which regular expression to use?
197+
Quelle expression régulière utiliser ?
198198

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`.
200200

201-
Let's check it:
201+
Voyons cela :
202202
```js run
203203
let str = '...<a href="link" class="doc">...';
204204
let regexp = /<a href=".*" class="doc">/g;
205205

206-
// Works!
206+
// Ça fonctionne !
207207
alert( str.match(regexp) ); // <a href="link" class="doc">
208208
```
209209

210-
It worked. But let's see what happens if there are many links in the text?
210+
Cela a fonctionné. Mais voyons ce qu'il se passe s'il y a plusieurs liens dans le texte ?
211211

212212
```js run
213213
let str = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
214214
let regexp = /<a href=".*" class="doc">/g;
215215

216-
// Whoops! Two links in one match!
216+
// Oups! Les deux liens dans la même correspondance!
217217
alert( str.match(regexp) ); // <a href="link1" class="doc">... <a href="link2" class="doc">
218218
```
219219

220-
Now the result is wrong for the same reason as our "witches" example. The quantifier `pattern:.*` took too many characters.
220+
Cette fois le résultat n'est pas le bon, pour la même raison que l'exemple avec "witches". Le quantificateur `pattern:.*` a pris trop de caractères.
221221

222-
The match looks like this:
222+
La correspondance ressemble à cela :
223223

224224
```html
225225
<a href="....................................." class="doc">
226226
<a href="link1" class="doc">... <a href="link2" class="doc">
227227
```
228228

229-
Let's modify the pattern by making the quantifier `pattern:.*?` lazy:
229+
Modifions le motif en rendant le quantificateur `pattern:.*?` paresseux :
230230

231231
```js run
232232
let str = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
233233
let regexp = /<a href=".*?" class="doc">/g;
234234

235-
// Works!
235+
// Ça fonctionne !
236236
alert( str.match(regexp) ); // <a href="link1" class="doc">, <a href="link2" class="doc">
237237
```
238238

239-
Now it seems to work, there are two matches:
239+
L'expression régulière semble fonctionner à présent, il y a bien deux correspondances :
240240

241241
```html
242242
<a href="....." class="doc"> <a href="....." class="doc">
243243
<a href="link1" class="doc">... <a href="link2" class="doc">
244244
```
245245

246-
...But let's test it on one more text input:
246+
... Mais testons-la sur un autre texte :
247247

248248
```js run
249249
let str = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
250250
let regexp = /<a href=".*?" class="doc">/g;
251251

252-
// Wrong match!
252+
// Mauvaise correspondance !
253253
alert( str.match(regexp) ); // <a href="link1" class="wrong">... <p style="" class="doc">
254254
```
255255

256-
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...>`.
257257

258-
Why?
258+
Pourquoi ?
259259

260-
That's what's going on:
260+
Voici ce qu'il se passe:
261261

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">`.
265265

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.
267267

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 :
269269

270270
```html
271271
<a href="..................................." class="doc">
272272
<a href="link1" class="wrong">... <p style="" class="doc">
273273
```
274274

275-
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.
276276

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.
278278

279-
A working example:
279+
Un exemple fonctionnel :
280280

281281
```js run
282282
let str1 = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
283283
let str2 = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
284284
let regexp = /<a href="[^"]*" class="doc">/g;
285285

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
288288
alert( str2.match(regexp) ); // <a href="link1" class="doc">, <a href="link2" class="doc">
289289
```
290290

291-
## Summary
291+
## Résumé
292292

293-
Quantifiers have two modes of work:
293+
Les quantificateurs ont deux modes de travail :
294294

295-
Greedy
296-
: 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.
297297

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é.
300300

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

Comments
 (0)