Skip to content

Commit be1526f

Browse files
committed
article first pass
1 parent 61cb5fd commit be1526f

File tree

1 file changed

+47
-47
lines changed

1 file changed

+47
-47
lines changed
Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,55 @@
11

2-
# Sticky flag "y", searching at position
2+
# Sticky flag "y", recherche depuis une position
33

4-
The flag `pattern:y` allows to perform the search at the given position in the source string.
4+
Le marqueur `pattern:y` permet d'effectuer la recherche à partir d'une position donnée dans la chaîne de caractères source.
55

6-
To grasp the use case of `pattern:y` flag, and better understand the ways of regexps, let's explore a practical example.
6+
Pour appréhender le cas d'usage du marqueur `pattern:y`, et mieux comprendre le fonctionnement des regexp, regardons un exemple pratique.
77

8-
One of common tasks for regexps is "lexical analysis": we get a text, e.g. in a programming language, and need to find its structural elements. For instance, HTML has tags and attributes, JavaScript code has functions, variables, and so on.
8+
Prenons un usage courant des regexps, l'analyse lexicale : Nous avons un texte, p. ex. dans un langage de programmation, et nous avons besoin de trouver ses éléments de structure. Par exemple, l'HTML a des balises et des attributs, du code JavaScript a des fonctions, variables, etc.
99

10-
Writing lexical analyzers is a special area, with its own tools and algorithms, so we don't go deep in there, but there's a common task: to read something at the given position.
10+
L'écriture d'analyseurs lexicaux est un domaine spécifique, avec ses propres outils et algorithmes que nous n'explorerons pas ici, mais il y a une tâche courante : Lire quelque chose depuis une position donnée.
1111

12-
E.g. we have a code string `subject:let varName = "value"`, and we need to read the variable name from it, that starts at position `4`.
12+
P. ex. prenons la chaîne de caractères `subject:let varName = "value"`, dans laquelle nous devons lire le nom de la variable, qui commence à la position `4`.
1313

14-
We'll look for variable name using regexp `pattern:\w+`. Actually, JavaScript variable names need a bit more complex regexp for accurate matching, but here it doesn't matter.
14+
Nous chercherons un nom de variable en utilisant la regexp `pattern:\w+`. En fait, les noms de variable en JavaScript nécessitent une regexp un poil plus complexe pour un résultat exact, mais cela est sans importance ici.
1515

16-
- A call to `str.match(/\w+/)` will find only the first word in the line (`let`). That's not it.
17-
- We can add the flag `pattern:g`. But then the call `str.match(/\w+/g)` will look for all words in the text, while we need one word at position `4`. Again, not what we need.
16+
- Un appel à `str.match(/\w+/)` trouvera seulement le premier mot de la ligne (`let`). Ça n'est pas ça.
17+
- Nous pouvons ajouter le marqueur `pattern:g`. Mais alors l'appel à `str.match(/\w+/g)` cherchera tous les mots du text, alors que nous avons besoin que d'un mot à partir de la position `4`. Ça n'est pas encore ça.
1818

19-
**So, how to search for a regexp exactly at the given position?**
19+
**Alors comment rechercher un motif à partir d'une position donné ?**
2020

21-
Let's try using method `regexp.exec(str)`.
21+
Essayons en utilisant la méthode `regexp.exec(str)`.
2222

23-
For a `regexp` without flags `pattern:g` and `pattern:y`, this method looks only for the first match, it works exactly like `str.match(regexp)`.
23+
Pour une `regexp` sans marqueur `pattern:g` ni `pattern:y`, cette méthode cherche seulement la première occurrence, cela fonctionne exactement comme `str.match(regexp)`.
2424

25-
...But if there's flag `pattern:g`, then it performs the search in `str`, starting from position stored in the `regexp.lastIndex` property. And, if it finds a match, then sets `regexp.lastIndex` to the index immediately after the match.
25+
...Mais s'il y a le marqueur `pattern:g`, il effectue alors une recherche dans `str`, à partir de la position stockée dans propriété `regexp.lastIndex`. Et s'il trouve une correspondance, il fixe `regexp.lastIndex` à l'index immédiatement après la correspondance.
2626

27-
In other words, `regexp.lastIndex` serves as a starting point for the search, that each `regexp.exec(str)` call resets to the new value ("after the last match"). That's only if there's `pattern:g` flag, of course.
27+
En d'autres termes, `regexp.lastIndex` sert de point de départ pour la recherche, que chaque appel à `regexp.exec(str)` change en une nouvelle valeur ("après la dernière correspondance"). Cela, bien entendu, seulement avec le marquer `pattern:g`.
2828

29-
So, successive calls to `regexp.exec(str)` return matches one after another.
29+
Donc chaque appel successif à `regexp.exec(str)` retourne une correspondance après l'autre.
3030

31-
Here's an example of such calls:
31+
Voici un exemple de tels appels :
3232

3333
```js run
34-
let str = 'let varName'; // Let's find all words in this string
34+
let str = 'let varName'; // Cherchons tous les mots dans cette chaîne de caractères
3535
let regexp = /\w+/g;
3636

37-
alert(regexp.lastIndex); // 0 (initially lastIndex=0)
37+
alert(regexp.lastIndex); // 0 (initialement lastIndex=0)
3838

3939
let word1 = regexp.exec(str);
40-
alert(word1[0]); // let (1st word)
41-
alert(regexp.lastIndex); // 3 (position after the match)
40+
alert(word1[0]); // let (1er mot)
41+
alert(regexp.lastIndex); // 3 (position après la première correspondance)
4242

4343
let word2 = regexp.exec(str);
44-
alert(word2[0]); // varName (2nd word)
45-
alert(regexp.lastIndex); // 11 (position after the match)
44+
alert(word2[0]); // varName (2e mot)
45+
alert(regexp.lastIndex); // 11 (position après la correspondance)
4646

4747
let word3 = regexp.exec(str);
48-
alert(word3); // null (no more matches)
49-
alert(regexp.lastIndex); // 0 (resets at search end)
48+
alert(word3); // null (plus aucune correspondance)
49+
alert(regexp.lastIndex); // 0 (réinitialisé à la fin de la recherche)
5050
```
5151

52-
We can get all matches in the loop:
52+
Nous pouvons obtenir toutes les correspondances avec la boucle :
5353

5454
```js run
5555
let str = 'let varName';
@@ -59,23 +59,23 @@ let result;
5959

6060
while (result = regexp.exec(str)) {
6161
alert( `Found ${result[0]} at position ${result.index}` );
62-
// Found let at position 0, then
62+
// Found let at position 0, puis
6363
// Found varName at position 4
6464
}
6565
```
6666

67-
Such use of `regexp.exec` is an alternative to method `str.matchAll`, with a bit more control over the process.
67+
Une telle utilisation de `regexp.exec` est une alternative à la méthode `str.matchAll`, avec un peu plus de contrôle sur le processus.
6868

69-
Let's go back to our task.
69+
Retournons à notre objectif.
7070

71-
We can manually set `lastIndex` to `4`, to start the search from the given position!
71+
Nous pouvons assigner à `lastIndex` la valeur `4`, pour commencer la recherche à partir de cette position !
7272

73-
Like this:
73+
Comme ceci :
7474

7575
```js run
7676
let str = 'let varName = "value"';
7777

78-
let regexp = /\w+/g; // without flag "g", property lastIndex is ignored
78+
let regexp = /\w+/g; // sans le marqueur "g", la propriété lastIndex est ignorée
7979

8080
*!*
8181
regexp.lastIndex = 4;
@@ -85,54 +85,54 @@ let word = regexp.exec(str);
8585
alert(word); // varName
8686
```
8787

88-
Hooray! Problem solved!
88+
Houra ! Problème résolu !
8989

90-
We performed a search of `pattern:\w+`, starting from position `regexp.lastIndex = 4`.
90+
Nous avons recherché le motif `pattern:\w+`, à partir de la position `regexp.lastIndex = 4`.
9191

92-
The result is correct.
92+
Le résultat est valide.
9393

94-
...But wait, not so fast.
94+
...Mais attendez, pas si vite.
9595

96-
Please note: the `regexp.exec` call starts searching at position `lastIndex` and then goes further. If there's no word at position `lastIndex`, but it's somewhere after it, then it will be found:
96+
Vous noterez : l'appel à `regexp.exec` commence la recherche à la position `lastIndex` et continue ensuite plus loin. S'il n'y a pas de mot à la position `lastIndex`, mais qu'il y en a un plus loin, il sera alors trouvé :
9797

9898
```js run
9999
let str = 'let varName = "value"';
100100

101101
let regexp = /\w+/g;
102102

103103
*!*
104-
// start the search from position 3
104+
// comme la recherche à la position 3
105105
regexp.lastIndex = 3;
106106
*/!*
107107

108108
let word = regexp.exec(str);
109-
// found the match at position 4
109+
// trouve la correspondance à la position 4
110110
alert(word[0]); // varName
111111
alert(word.index); // 4
112112
```
113113

114-
For some tasks, including the lexical analysis, that's just wrong. We need to find a match exactly at the given position at the text, not somewhere after it. And that's what the flag `y` is for.
114+
Pour certaines tâches, et pour les analyses lexicales en particulier, c'est juste faux. Nous avons besoin de trouver la correspondance du motif à la position exacte, et non quelque part après. Et c'est justement ce que fait le marqueur `y`.
115115

116-
**The flag `pattern:y` makes `regexp.exec` to search exactly at position `lastIndex`, not "starting from" it.**
116+
**Le marqueur `pattern:y` fait que `regexp.exec` recherche exactement à la position `lastIndex`, et non à partir de cette position.**
117117

118-
Here's the same search with flag `pattern:y`:
118+
Voici la même recherche avec le marqueur `pattern:y`:
119119

120120
```js run
121121
let str = 'let varName = "value"';
122122

123123
let regexp = /\w+/y;
124124

125125
regexp.lastIndex = 3;
126-
alert( regexp.exec(str) ); // null (there's a space at position 3, not a word)
126+
alert( regexp.exec(str) ); // null (il n'y a pas de mot en position 3, mais un espace)
127127

128128
regexp.lastIndex = 4;
129-
alert( regexp.exec(str) ); // varName (word at position 4)
129+
alert( regexp.exec(str) ); // varName (mot en position 4)
130130
```
131131

132-
As we can see, regexp `pattern:/\w+/y` doesn't match at position `3` (unlike the flag `pattern:g`), but matches at position `4`.
132+
Comme nous pouvons le voir, la regexp `pattern:/\w+/y` ne trouve pas de correspondance en position `3` (contrairement au marqueur `pattern:g`), mais trouve la correspondance en position `4`.
133133

134-
Not only that's what we need, there's an important performance gain when using flag `pattern:y`.
134+
Et en plus d'obtenir ce que nous cherchions, mais il y a un gain significatif de performance avec le marqueur `pattern:y`.
135135

136-
Imagine, we have a long text, and there are no matches in it, at all. Then a search with flag `pattern:g` will go till the end of the text and find nothing, and this will take significantly more time than the search with flag `pattern:y`, that checks only the exact position.
136+
Imaginez avec un long texte, et sans aucune correspondance dedans. Une recherche avec le marqueur `pattern:g` ira alors jusqu'à la fin du texte pour ne rien trouver, et cela prendra bien plus de temps qu'avec le marqueur `pattern:y`, qui vérifie seulement à la position exacte.
137137

138-
In tasks like lexical analysis, there are usually many searches at an exact position, to check what we have there. Using flag `pattern:y` is the key for correct implementations and a good performance.
138+
Dans des tâches comme en analyse lexicale, il y a habituellement beaucoup de recherches sur des positions exactes, pour vérifier ce qu'il s'y trouve. L'utilisation du marqueur `pattern:y` est la clé pour des bonnes implémentations et de bonnes performances.

0 commit comments

Comments
 (0)