/ / JavaScript RegExp не можна використовувати двічі? [дублікат] - javascript, регулярний вираз

JavaScript RegExp не використовується двічі? [дублікат] - javascript, regex

У мене дуже важка проблема:

var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];
var searchreg = new RegExp("test","g");

cat.forEach(function(item){
if(searchreg.test(item.slug)){
console.log(item);
}
});

Це повинно надрукувати мені обидва елементи з "кішки". Але я отримую лише перше. Якщо я додаю більше предметів, я отримую лише кожен 2-й (починати з першого).

Я розмовляю з цим:

var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];

cat.forEach(function(item){
var searchreg = new RegExp("test","g");
if(searchreg.test(item.slug)){
console.log(item);
}
});

Але я не розумію, чому це не працює (Chrome) - хтось ідею?

Відповіді:

6 за відповідь № 1

Це через те, що g ("глобальний") прапор. Екземпляри RegExp мають стан, коли ви використовуєте g прапор:Вони пам’ятають, де був останній збіг, який бачили, тому можуть продовжувати з цього моменту (наприклад, якщо ви використовуєте їх у циклі). (Так, це не найкращий дизайн, який він міг мати.) Отже перший час, це знаходить test у рядку (і зазначає, що це не в кінець рядка); вдруге вона намагається знайти test продовжуючи в попередньому рядку з попереднього місця, і, звичайно, не знаходить. Третій раз, оскільки він знає, що минулого разу у нього закінчилось введення, він знову переглядає введення.

У вашому випадку, оскільки вам не потрібно шукати далі, ніж перша інстанція, просто видаліть g прапор:

var searchreg = /test/; // That"s a regex literal, basically: ... = new RegEx("test")

Крім того, ви можете скинути його, призначивши 0 до його lastIndex майно:

searchreg.lastIndex = 0;
if (searchreg.test(item.slug))

Або в цьому конкретний у випадку використання, вам взагалі не потрібен регулярний вираз:

if (item.slug.indexOf("test") !== -1) {
// It has "test" in the slug
}