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