В чем смысл флага g в регулярных выражениях?
В чем разница между /.+/g и /.+/?
В чем смысл флага g в регулярных выражениях?
В чем разница между /.+/g и /.+/?
g предназначен для глобального поиска. Это будет соответствовать всем событиям. Обычно вы также видите i, что означает игнорировать регистр.
Отказ: global - JavaScript | MDN
Флаг "g" указывает, что регулярное выражение должно быть проверено на все возможные совпадения в строке.
Без флага g он будет проверяться только для первого.
Пример в Javascript для объяснения:
> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]
> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
g - это глобальный флаг поиска.
Глобальный флаг поиска делает поиск RegExp шаблоном во всей строке, создавая массив всех вхождений, которые он может найти, соответствующий данному шаблону.
Таким образом, разница между /.+/g и /.+/ заключается в том, что версия g найдет каждое вхождение вместо первого.
Нет разницы между /.+/g и /.+/, потому что они оба будут только соответствовать целой строке один раз. g имеет значение, если регулярное выражение может соответствовать более одного раза или содержать группы, и в этом случае .match() вернет массив совпадений вместо массива групп.
Рядом с уже упомянутым значением флага g он влияет на свойство regexp.lastIndex:
LastIndex - свойство целочисленного чтения/записи регулярного выражения экземпляры, которые указывают индекс, с которого нужно начать следующее совпадение. (...) Это свойство задается, только если экземпляр регулярного выражения использовал флаг "g" для указания глобального поиска.
Ссылка: Сеть разработчиков Mozilla
G в регулярных выражениях определяет глобальный поиск, что означает, что он будет искать все экземпляры на всех строках.
Как указывала @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);