В чем смысл флага "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);