运维日志您现在的位置是:首页 > 博客日志 > 运维日志

JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出

<a href='mailto:'>微wx笑</a>的头像微wx笑 2023-01-15运维日志 0 0关键字: JavaScript  正则表达式  RegExp  

JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出

JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出Smj无知


Smj无知

该问题起因于自己写的一个查找与替换功能Smj无知

相关代码如下:Smj无知

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);Smj无知

上面这段代码就可导致chrome浏览器内存溢出Smj无知

原因是因为 while 循环内部执行的 arr[0].replace(re, form.newcord.value); 导致 re.exec 的指针失效,每次都是从头开始,也就是导致了一个死循环,最终导致chrome浏览器内存溢出。Smj无知


Smj无知

解决方法Smj无知

虽然是相同的正则表达式,但是查找和替换的需要分开,再定义一个 RegExp 对象,代码如下:Smj无知

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;    
}


Smj无知

本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.com/blog/service/2023-01-15/1667.html

很赞哦! () 有话说 ()