Яке значення прапора 'g' у регулярних виразах?


110

Яке значення gпрапора в регулярних виразах?

У чому різниця між /.+/gі /.+/?

Відповіді:


130

gпризначений для глобального пошуку. Це означає, що він відповідатиме всім явищам. Зазвичай ви також побачите, iщо означає ігнорувати випадок.

Довідка: глобальна - JavaScript | MDN

Прапор "g" вказує на те, що регулярний вираз слід перевірити на всі можливі відповідники в рядку.

Без gпрапора це буде лише тест на перший.


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


6

Окрім вже згаданого значення gпрапора, він впливає на regexp.lastIndexвластивість:

LastIndex - це властивість читання / запису цілих чисел екземплярів регулярного вираження, яка вказує індекс, з якого слід починати наступний збіг. (...) Це властивість встановлюється лише в тому випадку, якщо екземпляр регулярного вираження використовував прапор "g" для позначення глобального пошуку.

Довідково: Мережа розробників Mozilla


3

G у регулярних виразах - це визначення глобального пошуку, що означає, що він шукатиме всі екземпляри у всіх рядках.


1

Наведемо приклад на основі рядка. Якщо ми хочемо видалити всі випадки з рядка. Скажімо, якщо ми хочемо видалити всі випадки "o" з "" з "привіт світу"

"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
Поясніть, будь ласка, далі - яка різниця між "усіма матчами" та "першим матчем"?
Ніко Хааз

Я пояснив більше. Дякуємо за ваші рекомендації
Nagibaba

@NicoHaase, чи можете ви скасуйте негативну ставку? Я намагався бути більш пояснювальним.
Нагібаба

Вибачте за нерозуміння :)
Nagibaba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.