Quelle est la signification de l'indicateur «g» dans les expressions régulières?


110

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

Quelle est la différence entre /.+/get /.+/?

Réponses:


130

gest pour la recherche globale. Cela signifie qu'il correspondra à toutes les occurrences. Vous verrez également généralement ice qui signifie ignorer la casse.

Référence: globale - JavaScript | MDN

L'indicateur "g" indique que l'expression régulière doit être testée par rapport à toutes les correspondances possibles dans une chaîne.

Sans le gdrapeau, il ne testera que le premier.


1
Ainsi, l'indicateur / g n'est pas pertinent lors de l'utilisation de la fonction .test, car il ne trouve de toute façon que la première correspondance, non?
xr280xr

10
@ xr280xr Pas hors de propos, plutôt contre-productif. Cela cassera les choses si vous réutilisez le RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch


41

Exemple en Javascript pour expliquer:

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

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

10

g est l'indicateur de recherche globale.

L'indicateur de recherche globale permet à RegExp de rechercher un modèle dans toute la chaîne, créant un tableau de toutes les occurrences qu'il peut trouver correspondant au modèle donné.

La différence entre /.+/get /.+/ est que la gversion trouvera chaque occurrence au lieu de la première.


9

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


8

Comme @matiska l'a souligné, l' gindicateur définit également la lastIndexpropriété.

Un effet secondaire très important de ceci est que si vous réutilisez la même instance de regex avec une chaîne correspondante, cela finira par échouer car il ne commencera à rechercher que sur le lastIndex.

// regular regex
const regex = /foo/;

// same regex with global flag
const regexG = /foo/g;

const str = " foo foo foo ";

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

// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);

// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);


6

Outre la signification déjà mentionnée du gdrapeau, il influence la regexp.lastIndexpropriété:

LastIndex est une propriété entière en lecture / écriture d'instances d'expressions régulières qui spécifie l'index à partir duquel commencer la correspondance suivante. (...) Cette propriété n'est définie que si l'instance d'expression régulière a utilisé l'indicateur "g" pour indiquer une recherche globale.

Référence: Mozilla Developer Network


3

G dans les expressions régulières est a définit une recherche globale, ce qui signifie qu'il rechercherait toutes les instances sur toutes les lignes.


1

Donnera un exemple basé sur la chaîne. Si nous voulons supprimer toutes les occurrences d'une chaîne. Disons si nous voulons supprimer toutes les occurrences de "o" avec "" de "hello world"

"hello world".replace(/o/g,'');

0
  1. g -> renvoie toutes les correspondances
  2. without g -> renvoie la première correspondance

exemple:

  1. '1 2 1 5 6 7'.match(/\d+/)revient ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Comme vous le voyez, nous ne pouvons prendre que le premier match "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)renvoie un tableau de toutes les correspondances ["1", "2", "1", "5", "6", "7"].

1
Veuillez expliquer cela plus en détail - quelle est la différence entre "tous les matchs" et "premier match"?
Nico Haase le

J'ai expliqué plus. Merci pour vos conseils
Nagibaba le

@NicoHaase pouvez-vous supprimer votre taux négatif? J'ai essayé d'être plus explicatif.
Nagibaba le

Désolé pour malentendu :)
Nagibaba
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.