Что означает флаг "g" в регулярных выражениях?

110

Что означает gфлаг в регулярных выражениях?

В чем разница между /.+/gи /.+/?

Intelis
источник

Ответы:

130

gдля глобального поиска. Это означает, что он будет соответствовать всем вхождениям. Обычно вы также видите, iчто означает игнорировать регистр.

Ссылка: global - JavaScript | MDN

Флаг «g» указывает, что регулярное выражение должно быть проверено на соответствие всем возможным совпадениям в строке.

Без gфлага он будет проверять только первое.

Sachleen
источник
1
Итак, флаг / g не имеет значения при использовании функции .test, потому что он все равно находит только первое совпадение, верно?
xr280xr
10
@ xr280xr Не имеет значения, скорее контрпродуктивно. Это сломает ситуацию, если вы повторно используете RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Янош
41

Пример в Javascript для объяснения:

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

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
Люк В
источник
10

g это флаг глобального поиска.

Флаг глобального поиска заставляет RegExp искать шаблон по всей строке, создавая массив всех вхождений, которые он может найти, соответствующих данному шаблону.

Таким образом, разница между /.+/gи /.+/ заключается в том, что gверсия будет находить каждое вхождение, а не только первое.

Дэвпмиллер
источник
9

Там нет никакой разницы между /.+/gи /.+/потому , что они оба будут только когда - либо совпадают всю строку сразу. gДелает разницу , если регулярное выражение может соответствовать более чем один раз или содержит группы, в этом случае .match()будет возвращать массив совпадений , а не массив групп.

Нил
источник
8

Как отметила @matiska, gфлаг также устанавливает lastIndexсвойство.

Очень важным побочным эффектом этого является то, что если вы повторно используете один и тот же экземпляр регулярного выражения для соответствующей строки, он в конечном итоге потерпит неудачу, потому что он начнет поиск только в 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
источник
6

Помимо уже упомянутого значения gфлага, он влияет на regexp.lastIndexсвойство:

LastIndex - это целочисленное свойство для чтения / записи экземпляров регулярных выражений, которое указывает индекс, с которого начинается следующее совпадение. (...) Это свойство устанавливается только в том случае, если экземпляр регулярного выражения использовал флаг «g» для указания глобального поиска.

Ссылка: Сеть разработчиков Mozilla

Матиска
источник
3

G в регулярных выражениях - это глобальный поиск, то есть поиск всех экземпляров по всем строкам.

Неонгардский
источник
1

Приведу пример на основе строки. Если мы хотим удалить все вхождения из строки. Допустим, хотим ли мы удалить все вхождения "o" с "" из "hello world"

"hello world".replace(/o/g,'');
Дипак
источник
0
  1. g -> возвращает все совпадения
  2. without g -> возвращает первое совпадение

пример:

  1. '1 2 1 5 6 7'.match(/\d+/)возвращается ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Как видите, мы можем взять только первый матч "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)возвращает массив всех совпадений ["1", "2", "1", "5", "6", "7"].
Нагибаба
источник
1
Пожалуйста, объясните это дальше - в чем разница между «все совпадения» и «первое совпадение»?
Нико Хаасе,
Я объяснил больше. Спасибо за ваше руководство
Нагибаба
@NicoHaase, пожалуйста, удалите отрицательную оценку? Я попытался пояснить подробнее.
Нагибаба
Извините за недоразумение :)
Нагибаба