/ / JavaScript RegExp non può essere utilizzato due volte? [duplicato] - javascript, regex

JavaScript RegExp non può essere utilizzato due volte? [duplicato] - javascript, regex

Ho un problema molto strage:

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

Questo dovrebbe stamparmi entrambi gli elementi da "gatto". Ma ho solo il primo Se aggiungo più elementi, ottengo solo il 2 ° (inizio con il primo).

Lo capisco con:

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

Ma non capisco perché questo non funzioni (Chrome) - qualcuno un'idea?

risposte:

6 per risposta № 1

È a causa del g ("globale") flag. Le istanze RegExp hanno lo stato quando si utilizza il g bandiera: Ricordano dove era l'ultima partita che hanno visto, quindi possono continuare da quel punto (ad esempio, se li stai usando in un ciclo). (Sì, questo non è il miglior design che avrebbe potuto avere.) Quindi il primo tempo, trova test nella stringa (e osserva che non è al fine della stringa); la seconda volta, cerca di trovare test continua nella stringa precedente dalla posizione precedente e, naturalmente, non la trova. La terza volta, dal momento che sa che è esaurita l'ultima volta, guarda di nuovo l'input.

Nel tuo caso, dal momento che non devi cercare oltre la prima istanza, semplicemente rimuovi il g bandiera:

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

In alternativa, è possibile ripristinarlo assegnando 0 al suo lastIndex proprietà:

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

O, in questo specifica use case, non hai bisogno di regex affatto:

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