В чем проблема с этим регулярным выражением, когда я использую глобальный флаг и флаг без учета регистра? Запрос - это пользовательский ввод. Результат должен быть [верно, верно].
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
около
источник
источник
re
.Ответы:
RegExp
Объект отслеживает ,lastIndex
где произошло совпадение, так и на последующих матчах он будет стартовать с последнего использованного индекса, вместо 0. Обратите внимание:Если вы не хотите вручную сбрасывать
lastIndex
на 0 после каждого теста, просто уберитеg
флаг.Вот алгоритм, который диктуют спецификации (раздел 15.10.6.2):
источник
lastIndex
в шагах 5, 6 и 11. Ваше вступительное заявление верно только в том случае, если установлен глобальный флаг.Вы используете один
RegExp
объект и выполняете его несколько раз. При каждом последующем выполнении он продолжается с последнего индекса соответствия.Вам необходимо «сбросить» регулярное выражение для начала с начала перед каждым выполнением:
Сказав, что может быть более удобочитаемым создание нового объекта RegExp каждый раз (издержки минимальны, поскольку RegExp все равно кэшируется):
источник
g
флаг.RegExp.prototype.test
обновляетlastIndex
свойство регулярных выражений, чтобы каждый тест начинался там, где остановился последний. Я бы предложил использовать,String.prototype.match
поскольку он не обновляетlastIndex
свойство:Примечание:
!!
преобразует его в логическое значение, а затем инвертирует логическое значение, чтобы оно отражало результат.Кроме того, вы можете просто сбросить
lastIndex
свойство:источник
Снятие глобального
g
флага решит вашу проблему.Должно быть
источник
Использование флага / g указывает ему продолжить поиск после попадания.
Если совпадение выполнено успешно, метод exec () возвращает массив и обновляет свойства объекта регулярного выражения.
Перед первым поиском:
После первого поиска
Удалите g, и он завершает поиск после каждого вызова exec ().
источник
exec
.Вам нужно установить re.lastIndex = 0, потому что с помощью флага regex отслеживайте последнее найденное совпадение, поэтому test не пойдет для проверки той же строки, для этого вам нужно сделать re.lastIndex = 0
источник
У меня была функция:
Первый звонок работает. Второй звонок нет.
slice
Операция жалуется на нулевое значение. Я предполагаю, что это из-заre.lastIndex
. Это странно, потому что я ожидал новогоRegExp
будет назначаться каждый раз, когда вызывается функция, а не совместно использоваться несколькими вызовами моей функции.Когда я изменил это на:
Тогда я не получаю
lastIndex
эффект удержания. Это работает так, как я ожидал.источник