为什么这个正则表达式执行这么长时间?

时间:2016-04-24 08:28:54

标签: javascript regex performance

我创建了regex,它应该在相邻的<span>标记旁移动文字。

const fix = (string) => string.replace(/([\S]+)*<span([^<]+)*>(.*?)<\/span>([\S]+)*/g, "<span$2>$1$3$4</span>")

fix('<p>Given <span class="label">Butter</span>&#39;s game, the tree counts as more than one input.</p>')
// Results in:
'<p>Given <span class="label">Butter&#39;s</span> game, the tree counts as more than one input.</p>'

但是,如果我传递一个字符串,其中没有文本触及<span>标记,则需要几秒钟才能运行。

我正在ChromeElectron进行测试。

1 个答案:

答案 0 :(得分:4)

当没有([\S]+)*时,

([^<]+)*</span>是导致catastrophic backtracking的罪魁祸首。您需要将正则表达式修改为

([\S]*)<span([^<]*)>(.*?)<\/span>([\S]*)

它会起作用,但仍然不是efficient

为什么要为\S使用字符类?以上简化为

(\S*)<span([^<]*)>(.*?)<\/span>(\S*)

如果您只关注span的内容,请改用

<span([^<]*)>(.*?)<\/span>

检查 here &lt; =(请参阅步骤数减少)

注意:最后不要使用正则表达式解析HTML,如果有工具可以更容易地做到这一点