gpt4 book ai didi

JavaScript 正则表达式文字在函数调用之间持续存在

转载 作者:数据小太阳 更新时间:2023-10-29 05:13:54 26 4
gpt4 key购买 nike

我有这段代码:

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');
}
...
}
}

这有效,除非执行了 throw 语句。在这种情况下,下次我调用该函数时,exec() 调用会从它停止的地方开始,即使我为它提供了一个新值“文本”。

我可以通过写来修复它

var pattern = new RegExp('.....');

相反,但我不明白为什么第一个版本失败了。正则表达式如何在函数调用之间持续存在? (这发生在最新版本的 Firefox 和 Chrome 中。)

编辑完成测试用例:

<!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>

在 FF 和 Chrome 上,正则表达式以“四”继续,而不是在 IE7 或 Opera 上。

最佳答案

通过正则表达式文字创建的 RegExp 对象被缓存,但 new RegExp 总是创建一个新对象。缓存的对象也保存它们的状态,但是管理这方面的规则显然不是很清楚。 Steve Levithan 在 this blog post 中谈到了这一点(靠近底部)。

关于JavaScript 正则表达式文字在函数调用之间持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2645273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com