2010-05-17 6 views
43

Mögliche Duplizieren:
Javascript regex returning true.. then false.. then true.. etcwarum mein Javascript regex.test() geben abwechselnd Ergebnisse

var r = /\d/g; 
var a = r.test("1"); // will be true 
var b = r.test("1"); // will be false 
console.log(a == b); // will be false 

mir bitte erklären, warum das Ergebnis r.test ("1 ") wechselt mit jedem Anruf?

Ich war in der Lage, das Problem zu umgehen, das ich hatte, indem ich den Modifikator g entfernte. Trotzdem würde ich gerne verstehen, warum das passiert.

Antwort

63

Wenn Sie /g verwenden, speichert das Regex-Objekt den Status zwischen den Anrufen (da Sie es für die Zuordnung mehrerer Anrufe verwenden sollten). Es stimmt nur einmal überein, aber nachfolgende Aufrufe beginnen nach der ursprünglichen Übereinstimmung.

(Dies ist ein Duplikat von Javascript regex returning true.. then false.. then true.. etc)

+0

danke! Ich habe einige weitere Details gefunden, die erklären, dass .test im Grunde eine Abkürzung für .exec()! = Null ist und es .exec() ist, das den lastIndex für den nächsten Aufruf speichert. (http://www.regular-expressions.info/javascript.html) Was seltsam ist, ist, dass selbst wenn verschiedene Strings für jeden Anruf gegeben werden, das gleiche auftritt. Wird der lastIndex nicht zurückgesetzt, wenn er in einer anderen Zeichenfolge aufgerufen wird? –

+1

Nein, weil 'lastIndex' eine Eigenschaft der Regex ist, nicht die Zeichenfolge. In Perl dagegen ist es mit der Zeichenkette (der 'pos'-Eigenschaft) verknüpft, während es in Java durch das Matcher-Objekt verwaltet wird. 'lastIndex' ist eine Quelle großer Frustration: http://blog.stevenlevithan.com/archives/fixing-javascript-regexp –

Verwandte Themen