Ich bin ernsthaft verrückt danach und habe bereits unverhältnismäßig viel Zeit damit verbracht, herauszufinden, was hier vor sich geht. Also bitte hilf mir =)
Ich muss einige RegExp-Übereinstimmungen von Zeichenfolgen in JavaScript durchführen. Leider verhält es sich sehr seltsam. Dieser Code:
var rx = /(cat|dog)/gi;
var w = new Array("I have a cat and a dog too.", "There once was a dog and a cat.", "I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.");
for (var i in w) {
var m = null;
m = rx.exec(w[i]);
if(m){
document.writeln("<pre>" + i + "\nINPUT: " + w[i] + "\nMATCHES: " + m.slice(1) + "</pre>");
}else{
document.writeln("<pre>" + i + "\n'" + w[i] + "' FAILED.</pre>");
}
}
Gibt "Katze" und "Hund" für die ersten beiden Elemente zurück, wie es sein sollte, aber dann exec()
kehren einige Anrufe zurück null
. Ich verstehe nicht warum.
Ich habe hier eine Geige gepostet , in der Sie den Code ausführen und bearbeiten können.
Und bis jetzt habe ich dies in Chrome und Firefox versucht.
Prost!
/ Christofer
javascript
regex
cpak
quelle
quelle
"I have a cat and a dog too."
, wie es scheintAntworten:
Oh, hier ist es. Da Sie Ihren Regex global definieren, stimmt er zuerst
cat
und beim zweiten Durchgang der Schleife übereindog
. Im Grunde müssen Sie also auch nur Ihren regulären Ausdruck (den internen Zeiger) zurücksetzen. Vgl. Dies:var w = new Array("I have a cat and a dog too.", "I have a cat and a dog too.", "I have a cat and a dog too.", "I have a cat and a dog too."); for (var i in w) { var rx = /(cat|dog)/gi; var m = null; m = rx.exec(w[i]); if(m){ document.writeln("<p>" + i + "<br/>INPUT: " + w[i] + "<br/>MATCHES: " + w[i].length + "</p>"); }else{ document.writeln("<p><b>" + i + "<br/>'" + w[i] + "' FAILED.</b><br/>" + w[i].length + "</p>"); } document.writeln(m); }
quelle
Das Regex-Objekt verfügt über eine Eigenschaft,
lastIndex
die beim Ausführen aktualisiert wirdexec
. Wenn Sie also die Regex für z. B. "Ich habe auch eine Katze und einen Hund." Ausführen,lastIndex
wird diese auf 12 gesetzt . Wenn Sie das nächste Malexec
dasselbe Regex-Objekt ausführen , wird ab Index 12 gesucht. Sie müssen also dielastIndex
Eigenschaft zurücksetzen zwischen jedem Lauf.quelle
myRe.lastIndex = 0;
für die spätere Verwendung eingestellt wird.Zwei Dinge:
g
(globalen) Flags. Um dies zu lösen, habe ich empfohlen, einfach0
demlastIndex
Mitglied desRegExp
Objekts zuzuweisen . Dies hat eine bessere Leistung als das Zerstören und Wiederherstellen.in
Stichwort, um ein zu gehenArray
Objekt, weil zu unerwarteten Ergebnissen mit einigen Libs führen kann. Manchmal sollten Sie sich bei jemandem wie erkundigenisNaN(i)
, oder wenn Sie wissen, dass es keine Löcher hat, verwenden Sie den Klassiker for loop.Der Code kann sein:
var rx = /(cat|dog)/gi; w = ["I have a cat and a dog too.", "There once was a dog and a cat.", "I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat."]; for (var i in w) if(!isNaN(i)) // Optional, check it is an element if Array could have some odd members. { var m = null; m = rx.exec(w[i]); // Run rx.lastIndex = 0; // Reset if(m) { document.writeln("<pre>" + i + "\nINPUT: " + w[i] + "\nMATCHES: " + m.slice(1) + "</pre>"); } else { document.writeln("<pre>" + i + "\n'" + w[i] + "' FAILED.</pre>"); } }
quelle
rx.lastIndex = 0
ist viel besser als das RegEx-Objekt innerhalb der Schleife neu zu erstellen.Ich hatte ein ähnliches Problem nur mit / g, und die hier vorgeschlagene Lösung funktionierte in FireFox 3.6.8 nicht für mich. Ich habe mein Skript zum Arbeiten gebracht
var myRegex = new RegExp("my string", "g");
Ich füge dies hinzu, falls jemand anderes das gleiche Problem hat, das ich mit der obigen Lösung gemacht habe.
quelle