2010-09-28 14 views
9

ich folgende Javascript bin mit Strings aus einer Textdatei lesen und sie mit einem regulären AusdruckJavascript Regular Expression nicht jedes anderes Mal aufgerufen wird

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    do stuff with match 
} 

Das Problem, das ich habe ist, dass jede andere Zeit verarbeiten re.exec heißt es schlägt fehl und gibt null zurück; Die erste Zeile wird also korrekt verarbeitet, aber die zweite Zeile führt zu null, dann funktioniert die dritte Zeile und die vierte Zeile ergibt null.

kann ich den folgenden Code verwenden, um das Ergebnis I

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    if (match == null) match = re.exec(currLine); 
} 

will zu bekommen, aber das scheint ein wenig eine heftige Flickschusterei. Kann mir jemand sagen, warum das passiert und was ich tun kann, um es richtig zu beheben?

+0

Andy E hat die richtige Lösung, aber falls Sie interessiert sind, könnten Sie die letzte Zeile in 'match = match || ändern re.exec (currLine); ' – Skilldrick

+0

@Skilldrick: gelöscht meins, weil Bobincos Antwort vollständiger war. Jetzt hat er die richtige Lösung :-) –

Antwort

21

Ihre re mit dem ‚globalen‘ Modifier definiert ist, zB. etwas wie /foo/g.

Wenn eine RegExp global ist, behält sie den verborgenen Status in der RegExp-Instanz selbst bei, um sich an den letzten übereinstimmenden Ort zu erinnern. Wenn Sie das nächste Mal suchen, sucht es nach dem Index des Endes des letzten Spiels und findet das nächste Spiel von dort. Wenn Sie eine andere Zeichenfolge an die übergeben, die Sie das letzte Mal passiert haben, wird dies zu sehr unvorhersehbaren Ergebnissen führen!

Wenn Sie g lobale Regexps verwenden, sollten Sie sie ausschöpfen, indem Sie sie wiederholt aufrufen, bis Sie null erhalten. Wenn Sie das nächste Mal verwenden, werden Sie vom Anfang der Zeichenfolge wieder übereinstimmen. Alternativ können Sie auch explizit re.lastIndex auf 0 setzen, bevor Sie einen verwenden. Wenn Sie nur auf das Vorhandensein einer Übereinstimmung testen möchten, wie in diesem Beispiel, ist es am einfachsten, g nicht zu verwenden.

Die JS RegExp-Schnittstellen sind einer der verwirrendsten, schlecht entworfenen Teile der Sprache. (Und das ist JavaScript, das sagt eine Menge.)

+1

+1, gelöscht meins dafür. Ich wollte auf meiner erweitern, aber ich habe abgelenkt :-) –

+0

Danke für die ausgezeichnete Antwort bobince. Ich habe das g entfernt und es funktioniert jetzt perfekt. – Pandelon

3

Javascript reguläre Ausdrücke halten einen Zustand zwischen den Ausführungen und Sie fallen wahrscheinlich in diese Falle.

Ich benutze immer die String.match Funktion und gebissen haben nie:

while (!textFile.AtEndOfStream) 
{ 
    match = textFile.ReadLine().match (re); 
    do stuff with match 
}