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