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

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.


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' ]

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.


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.


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);


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


3

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


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,'');

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"].

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.