182 votes

Quelle est la signification du drapeau 'g' dans les expressions régulières?

Quelle est la signification du drapeau g dans les expressions régulières?

Quelle est la différence entre /.+/g et /.+/?

198voto

sachleen Points 17288

g est pour une recherche globale. Cela signifie qu'elle correspondra à toutes les occurrences. Vous verrez généralement aussi i qui signifie ignorer la casse.

Reference: global - JavaScript | MDN

Le drapeau "g" indique que l'expression régulière doit être testée contre toutes les correspondances possibles dans une chaîne.

Sans le drapeau g, elle ne testera que pour la première.

De plus, assurez-vous de vérifier la réponse de cchamberlain ci-dessous pour des détails sur la façon dont elle définit la propriété lastIndex, ce qui peut entraîner des effets secondaires inattendus lors de la réutilisation d'une regex contre une série de valeurs.

3 votes

Donc le drapeau /g est sans importance lors de l'utilisation de la fonction .test, car elle ne trouve de toute façon que la première correspondance, n'est-ce pas?

26 votes

@xr280xr Pas inapproprié, mais plutôt contre-productif. Cela va causer des problèmes si vous réutilisez l'expression régulière. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false

68voto

lukewendling Points 959

Exemple en JavaScript pour expliquer :

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]

0 votes

Merci. Je n'étais pas sûr que les regex en JavaScript pouvaient renvoyer un tableau comme c'est le cas en PHP, cela le confirme.

21voto

Cole Chamberlain Points 1263

Comme @matiska l'a souligné, le drapeau g définit également la propriété lastIndex.

Un effet secondaire très important de cela est que si vous réutilisez la même instance regex contre une chaîne correspondante, elle échouera éventuellement car elle ne commence la recherche qu'à partir du lastIndex.

// regex normale
const regex = /foo/;

// même regex avec le drapeau global
const regexG = /foo/g;

const str = " foo foo foo ";

const test = (r) => console.log(
    r,
    r.lastIndex,
    r.test(str),
    r.lastIndex
);

// Tester la normale 4 fois (réussi)
test(regex);
test(regex);
test(regex);
test(regex);

// Tester la globale 4 fois
// (3 succès et un échec)
test(regexG);
test(regexG);
test(regexG);
test(regexG);

4 votes

Après avoir passé 3 heures sur le bug, j'ai découvert cette réponse. J'avais utilisé le drapeau /g qui sautait quelques occurrences du motif car il avançait toujours. Tu m'as sauvé la journée. Merci !

17voto

DaveyLaser Points 1567

g est le drapeau de recherche global.

Le drapeau de recherche global permet à l'expression régulière de rechercher un motif dans toute la chaîne, créant un tableau de toutes les occurrences qu'elle peut trouver correspondant au motif donné.

Donc, la différence entre /.+/g et /.+/ est que la version avec g trouvera chaque occurrence au lieu de seulement la première.

12voto

Neil Points 24938

Il n'y a pas de différence entre /.+/g et /.+/ car ils ne correspondront chacun qu'à l'ensemble de la chaîne une seule fois. Le g fait une différence si l'expression régulière peut correspondre plus d'une fois ou contient des groupes, auquel cas .match() renverra un tableau des correspondances au lieu d'un tableau des groupes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X