JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
微wx笑
2023-01-15【运维日志】
121
0
0关键字:
JavaScript 正则表达式 RegExp
JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
JavaScript中RegExp的exec方法+replace方法导致chrome浏览器内存溢出
该问题起因于自己写的一个查找与替换功能
相关代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 对象,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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