Почему этот код возвращает true, а false
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
Демо: Fiddle
Почему этот код возвращает true, а false
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
Демо: Fiddle
g
предназначен для повторения поиска. Он изменяет объект регулярного выражения на итератор. Если вы хотите использовать функцию test
, чтобы проверить, что ваша строка действительна в соответствии с вашим шаблоном, удалите этот модификатор:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
Функция test
, в отличие от replace
или match
, не потребляет всю итерацию, что позволяет ей "плохо". Вероятно, вы никогда не должны использовать этот модификатор при использовании функции test
.
Вы не хотите использовать gi в сочетании с pattern.test. Флаг g означает, что он отслеживает, где вы работаете, чтобы его можно было повторно использовать. Поэтому вместо этого вы должны использовать:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
Кроме того, вы можете использовать синтаксис /.../[flags] для регулярного выражения, например:
var pattern = /mstea/i;
Поскольку вы устанавливаете модификатор g
.
Удалите его для вашего дела.
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
Это не ошибка.
g
заставляет его выполнить следующее попытанное соответствие для подстроки после первого совпадения. И именно поэтому он возвращает false в каждой попытке.
First attempt:
It is testing "Amanda Olmstead"
Second attempt:
It is testing "d" //match found in previous attempt (performs substring there)
Third attempt:
It is testing "Amanda Olmstead" again //no match found in previous attempt
... so on
Страница MDN для Regexp.exec
:
Если ваше регулярное выражение использует флаг "g", вы можете использовать exec метод несколько раз, чтобы найти последовательные совпадения в одной строке. Когда вы это сделаете, поиск начинается с подстроки строки, указанной в свойство lastIndex регулярного выражения
Страница MDN для test
:
Как и в случае с exec (или в сочетании с ним), тест называется несколько раз на том же глобальном экземпляре регулярного выражения будет продвигаться мимо предыдущий матч.