ich dieses Stück Code haben:JavaScript regulären Ausdruck wörtliche verharrt zwischen Funktionsaufrufe
function func1(text) {
var pattern = /([\s\S]*?)(\<\?(?:attrib |if |else-if |else|end-if|search |for |end-for)[\s\S]*?\?\>)/g;
var result;
while (result = pattern.exec(text)) {
if (some condition) {
throw new Error('failed');
}
...
}
}
Dies funktioniert, es sei denn, die throw-Anweisung ausgeführt wird. In diesem Fall beginnt der Aufruf exec() beim nächsten Aufruf der Funktion dort, wo er aufgehört hat, obwohl ich ihn mit einem neuen Wert von 'text' versehe.
Ich kann das Problem beheben, indem er
var pattern = new RegExp ('.....');
stattdessen, aber ich verstehe nicht, warum die erste Version fehlschlägt. Wie bleibt der reguläre Ausdruck zwischen Funktionsaufrufen? (Dies ist in den neuesten Versionen von Firefox und Chrome geschieht.)
bearbeiten komplette Testfall:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
</style>
<script type='text/javascript'>
function func1(text, count) {
var pattern = /(one|two|three|four|five|six|seven|eight)/g;
log("func1");
var result;
while (result = pattern.exec(text)) {
log("result[0] = " + result[0] + ", pattern.index = " + pattern.index);
if (--count <= 0) {
throw "Error";
}
}
}
function go() {
try { func1("one two three four five six seven eight", 3); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
try { func1("one two three four five six seven eight", 99); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
}
function log(msg) {
var log = document.getElementById('log');
var p = document.createElement('p');
p.innerHTML = msg;
log.appendChild(p);
}
</script>
</head>
<body><div>
<input type='button' id='btnGo' value='Go' onclick='go();'>
<hr>
<div id='log'></div>
</div></body>
</html>
Der reguläre Ausdruck setzt sich mit ‚vier‘ ab dem zweiten Anruf auf FF und Chrome, nicht auf IE7 oder Opera.
Ich habe mir die Freiheit genommen, einen vollständigen, vereinfachten Testfall zu veröffentlichen, ich hoffe, es macht Ihnen nichts aus. Ich habe auch dieses Verhalten gesehen und habe mich gefragt, warum es so wäre. Es sieht aus und riecht wie ein Käfer, aber manchmal sind die Dinge sehr subtil und es ist überraschend, dass sowohl FF als auch Chrome ihre * komplett * verschiedenen zugrundeliegenden Javascript-Engines bekommen haben. –
Nur um klar zu sein, es funktioniert, solange der Fehler/Ausnahme nicht ausgelöst wird, aber wenn 'eine Bedingung' wahr wird und die Ausnahme ausgelöst wird, wird die Funktion beim nächsten Aufruf fehlschlagen, weil das Muster von wo fortgesetzt wird Ausnahme wurde geworfen? Das klingt sicher wie ein Fehler, der nicht in deinen Händen liegt. – PatrikAkerstrand