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
+22-22Lines changed: 22 additions & 22 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,15 +2,15 @@
2
2
3
3
Les quantificateurs, à première vue, très simples, peuvent parfois être retors.
4
4
5
-
Nous devons mieux comprendre comment marche une recherche pour arriver à trouver des modèles plus complexes que `pattern:/\d+/`.
5
+
Pour réussir à trouver des motifs plus complexes que `pattern:/\d+/`, nous devons voir plus en détail comment se déroule une recherche.
6
6
7
7
Prenons comme exemple la tâche suivante.
8
8
9
-
Nous avons un texte dans lequel nous devons remplacer tous les guillemets droits (doubles) `"..."` par des guillemets français : `«...»`, qui sont préférés comme typographie dans de nombreux pays.
9
+
Nous avons un texte dans lequel nous devons remplacer tous les guillemets droits (doubles) `"..."` par des guillemets français : `«...»`, souvent préférés comme typographie dans de nombreux pays.
10
10
11
11
Par exemple : `"Hello, world"` devrait se transformer en `«Hello, world»`. Il existe d'autre guillemets, comme `„Witam, świat!”` (polonais) ou `「你好,世界」` (chinois), mais pour notre exemple choisissons `«...»`.
12
12
13
-
La première chose à faire est de trouver ces guillemets droits, et nous pourrons alors les remplacer.
13
+
La première chose à faire est de trouver ces guillemets droits, et nous pourrons ensuite les remplacer.
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
@@ -24,73 +24,73 @@ let str = 'a "witch" and her "broom" is one';
24
24
alert( str.match(regexp) ); // "witch" and her "broom"
25
25
```
26
26
27
-
... Nous pouvons voir que ça ne marche exactement comme prévu !
27
+
... Nous pouvons voir que ça ne marche pas exactement comme prévu !
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
31
Qui peut être vu comme "La cupidité est à la racine de tous les ennuis".
32
32
33
33
## Recherche gloutonne
34
34
35
-
Pour trouver une correspondance, le moteur d'expression rationnelle utilise l'algorithme suivant :
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
-
- Essaye de trouver le modèle à cette position.
38
+
- Essaye de trouver le motif à cette position.
39
39
- S'il n'y a pas de 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 modèle`pattern:".+"`.
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:".+"`.
42
42
43
-
1. le premier caractère du modèle 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 rationnelles 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'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.
46
46
47
-
Puis il avance : va aux positions suivantes dans la chaîne source et essaye d'y trouver le premier caractère du modèle, il échoue une nouvelle fois, avant de trouver les guillemets en troisième position :
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 modèle. Il essaye de voir si le reste de la chaîne suit le modèle`pattern:.+"`.
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:.+"`.
52
52
53
-
Dans notre cas le caractère suivant dans le modèle 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'` marche :
54
54
55
55

56
56
57
-
3. Le point est alors répété avec le quantificateur `pattern:.+`. le moteur d'expression rationnelle ajoute à la correspondance, les caractères les uns à la suite des autres.
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
59
... Jusqu'à quand ? 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
-
4. La répétition du modèle`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 !
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 rationnelles comprend qu'il a pris trop de `pattern:.+` et commence à revenir sur ses pas.
65
+
Le moteur d'expressions régulières 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 modèle à partir de cette position.
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
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.
74
74
75
-
5. ... Le moteur d'expression rationnelle diminue encore le nombre de répétitions de `pattern:.+` d'un autre caractère :
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
77
77

78
78
79
79
les guillemets `pattern:'"'` ne correspondent pas à `subject:'n'`.
80
80
81
-
6. Le moteur continue sa marche arrière : il réduit le nombre de répétitions de `pattern:'.'` jusqu'à trouver une correspondance pour la suite du modèle (dans notre cas `pattern:'"'`) :
81
+
6. Le moteur continue sa marche arrière : il réduit le nombre de répétitions de `pattern:'.'` jusqu'à trouver une correspondance pour la suite du motif (dans notre cas `pattern:'"'`) :
82
82
83
83

84
84
85
-
7. La correspondance avec modèle est complète.
85
+
7. La correspondance avec motif est complète.
86
86
87
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.
88
88
89
-
Ce n'est peut-être pas ce que nous attendions, mais c'est ainsi que sa fonctionne.
89
+
Ce n'est peut-être pas ce que nous attendions, mais c'est ainsi que cela fonctionne.
90
90
91
-
**En mode glouton (mode par défaut) un caractère avec quantificateur est répété autant de fois que possible.**
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
93
-
Le moteur d'expression rationnelle ajoute autant de caractères que possible pour le modèle`pattern:.+`, puis réduit la correspondance caractère par caractère, si la suite du modèle ne trouve pas de correspondance.
93
+
Le moteur d'expression régulière ajoute autant de caractères que possible pour le motif`pattern:.+`, puis réduit la correspondance caractère par caractère, si la suite du motif ne trouve pas de correspondance.
94
94
95
95
Nous avons besoin d'autre chose pour mener à bien notre tâche. Et le mode paresseux va pouvoir nous aider.
0 commit comments