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 /.+/?

Intelis
la source

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.

sachleen
la source
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' ]
Luke W
la source
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.

Davepmiller
la source
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.

Neil
la source
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);

cchamberlain
la source
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

matiska
la source
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.

Neonguardian
la source
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,'');
Deepak
la source
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"].
Nagibaba
la source
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