2013-04-18 7 views
6

ich einen seltsamen Fall mit einem regulären Ausdruck in JavaScript habe:Regex Testfunktion zurückgeben nicht die gleichen, je zitiert

var re = /[^\s]+(?:\s+|$)/g; 
re.test('foo'); // return true 
re.test("foo"); // return false 

ist ein regulärer Ausdruck Typ empfindlich? Mein erstes Ziel ist es, alle Wörter (getrennt durch einen oder mehrere Leerzeichen) eines Strings zu extrahieren.

Danke für Ihre Hilfe.

Julien

+0

Was meinst du mit 'Typ empfindlich'? – Brian

+3

Wenn Sie 're.test ('foo');' weiterlaufen lassen, wechselt es zwischen 'true' und' false'. Das ist ziemlich seltsam. – Blender

+0

Sie haben Recht Blender. Hast du eine Idee warum? – JuSchz

Antwort

10

Bei Verwendung der g Flagge auf einem Javascript regulären Ausdruck, wird es verfolgen, wo die letzte Übereinstimmung gefunden wurde und starten Sie von diesem Index suchen Sie das nächste Mal versuchen, eine Übereinstimmung zu finden.

Zwischen den beiden re.test() Anrufe, werfen Sie einen Blick auf re.lastIndex, um zu sehen, worüber ich spreche.

Zum Beispiel:

var re = /[^\s]+(?:\s+|$)/g; 
re.test('foo'); // return true 
re.lastIndex; // 3 
re.test("foo"); // return false 

Sie werden feststellen, dass die Art der Anführungszeichen verwenden Sie spielt keine Rolle, re.test('foo'); re.test('foo'); wird das gleiche Verhalten.

Wenn Sie die Regex starten frisch mögen, können Sie entweder die globale Flagge von Ihrem Regex entfernen oder re.lastIndex-0 nach jedem Versuch gesetzt ein Spiel, zum Beispiel zu finden:

var re = /[^\s]+(?:\s+|$)/g; 
re.test('foo'); // return true 
re.lastIndex = 0; 
re.test("foo"); // return true 

Die Wechselfestgestellt durch Blender in Kommentaren kann erklärt werden, weil lastIndex automatisch auf 0 gesetzt wird, wenn eine Übereinstimmung fehlschlägt, so dass der nächste Versuch nach dem Fehler erfolgreich sein wird.

+0

Danke für deine Antwort. Ich kann globale Parameter nicht entfernen, weil ich String wie "foo bar" behandeln muss. Ihre Lösung scheint zu funktionieren. Vielen Dank. – JuSchz

Verwandte Themen