JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
微wx笑
2023-01-15【运维日志】
0
0关键字:
JavaScript 正则表达式 RegExp
JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
该问题起因于自己写的一个查找与替换功能
相关代码如下:
function regexp_Replace_I(form){
if (form.source1.value == ""){
alert("请输入要被查找替换的代码!");
form.source1.focus();
return;
}
if (form.record.value == ""){
alert("请输入被替换的代码!\n内容为正则表达式!");
form.record.focus();
return;
}
//form.source2.value = form.source1.value.replace(re, form.newcord.value);
var re = new RegExp(form.record.value,"ig");
var arr;
var fc = 0;
var rlt = "";
var line = "";
try{
while ((arr = re.exec(form.source1.value)) != null){
if (arr.length > 0){
line = arr[0].replace(re, form.newcord.value);
if (line.indexOf("$i") != -1){
line = line.replaceAll("$i", fc);
}else{
line = line + fc;
}
rlt += line;
}
fc += 1;
}
}catch(e){
console.log(e);
}
form.source2.value = rlt;
}从代码中可以看到声明了一个 RegExp 对象 re,然后循环执行 re.exec 和 line = arr[0].replace(re, form.newcord.value);
上面这段代码就可导致chrome浏览器内存溢出
原因是因为 while 循环内部执行的 arr[0].replace(re, form.newcord.value); 导致 re.exec 的指针失效,每次都是从头开始,也就是导致了一个死循环,最终导致chrome浏览器内存溢出。
解决方法
虽然是相同的正则表达式,但是查找和替换的需要分开,再定义一个 RegExp 对象,代码如下:
function regexp_Replace_I(form){
if (form.source1.value == ""){
alert("请输入要被查找替换的代码!");
form.source1.focus();
return;
}
if (form.record.value == ""){
alert("请输入被替换的代码!\n内容为正则表达式!");
form.record.focus();
return;
}
//form.source2.value = form.source1.value.replace(re, form.newcord.value);
var re = new RegExp(form.record.value,"ig");
var re2 = new RegExp(form.record.value,"ig");
var arr;
var fc = 0;
var rlt = "";
var line = "";
try{
while ((arr = re.exec(form.source1.value)) != null){
if (arr.length > 0){
line = arr[0].replace(re2, form.newcord.value);
if (line.indexOf("$i") != -1){
line = line.replaceAll("$i", fc);
}else{
line = line + fc;
}
rlt += line;
}
fc += 1;
}
}catch(e){
console.log(e);
}
form.source2.value = rlt;
}本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/service/2023-01-15/1667.html



