Jakie jest znaczenie flagi „g” w wyrażeniach regularnych?

110

Jakie jest znaczenie gflagi w wyrażeniach regularnych?

Jaka jest różnica między /.+/gi /.+/?

intelis
źródło

Odpowiedzi:

130

gsłuży do wyszukiwania globalnego. Oznacza to, że będzie pasować do wszystkich wystąpień. Zwykle zobaczysz także, ico oznacza ignorowanie wielkości liter.

Odniesienie: globalne - JavaScript | MDN

Flaga „g” wskazuje, że wyrażenie regularne powinno być testowane pod kątem wszystkich możliwych dopasowań w ciągu.

Bez gflagi przetestuje tylko pierwszy.

sachleen
źródło
1
Więc flaga / g jest nieistotna, gdy używasz funkcji .test, ponieważ i tak znajduje tylko pierwsze dopasowanie, prawda?
xr280xr
10
@ xr280xr Nie ma znaczenia, bardziej przypomina efekt przeciwny do zamierzonego. Zepsuje to, jeśli ponownie użyjesz RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch
41

Przykład w JavaScript, aby wyjaśnić:

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

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
Luke W.
źródło
10

g to flaga wyszukiwania globalnego.

Globalna flaga wyszukiwania sprawia, że ​​RegExp wyszukuje wzorzec w całym ciągu, tworząc tablicę wszystkich wystąpień, które może znaleźć, pasujących do danego wzorca.

Zatem różnica między /.+/gi /.+/ polega na tym, że gwersja znajdzie każde wystąpienie, a nie tylko pierwsze.

davepmiller
źródło
9

Nie ma różnicy między /.+/gi, /.+/ponieważ oba zawsze dopasowują cały ciąg tylko raz. To grobi różnicę, jeśli wyrażenie regularne może pasować więcej niż raz lub zawiera grupy, w takim przypadku .match()zwróci tablicę dopasowań zamiast tablicy grup.

Neil
źródło
8

Jak zauważył @matiska, gflaga również ustawia lastIndexwłaściwość.

Bardzo ważnym efektem ubocznym jest to, że jeśli ponownie używasz tej samej instancji wyrażenia regularnego względem pasującego ciągu, ostatecznie zakończy się to niepowodzeniem, ponieważ wyszukiwanie rozpocznie się dopiero od 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
źródło
6

Oprócz wspomnianego już znaczenia gflagi wpływa na regexp.lastIndexwłaściwości:

LastIndex jest własnością całkowitą do odczytu / zapisu instancji wyrażeń regularnych, która określa indeks, od którego ma się rozpocząć następne dopasowanie. (...) Ta właściwość jest ustawiana tylko wtedy, gdy instancja wyrażenia regularnego używała flagi „g” do wskazania wyszukiwania globalnego.

Źródła: Mozilla Developer Network

matiska
źródło
3

G w wyrażeniach regularnych to a definiuje przeszukiwanie globalne, co oznacza, że ​​będzie szukać wszystkich wystąpień we wszystkich wierszach.

Neonguardian
źródło
1

Podam przykład na podstawie sznurka. Jeśli chcemy usunąć wszystkie wystąpienia z łańcucha. Powiedzmy, że chcemy usunąć wszystkie wystąpienia „o” z „” z „hello world”

"hello world".replace(/o/g,'');
Deepak
źródło
0
  1. g -> zwraca wszystkie dopasowania
  2. without g -> zwraca pierwsze dopasowanie

przykład:

  1. '1 2 1 5 6 7'.match(/\d+/)zwraca ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Jak widzisz, możemy wziąć tylko pierwszy mecz "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)zwraca tablicę wszystkich dopasowań ["1", "2", "1", "5", "6", "7"].
Nagibaba
źródło
1
Proszę wyjaśnić to dalej - jaka jest różnica między „wszystkimi dopasowaniami” a „pierwszym dopasowaniem”?
Nico Haase
Wyjaśniłem więcej. Dzięki za wskazówki
Nagibaba,
@NicoHaase czy możesz usunąć swoją ujemną stawkę? Starałem się mówić bardziej szczegółowo.
Nagibaba
Przepraszamy za nieporozumienie :)
Nagibaba