美文网首页正则表达式
正则表达式之灾难性回溯

正则表达式之灾难性回溯

作者: zxiaozhang | 来源:发表于2020-12-18 17:23 被阅读0次

在《贪婪与非贪婪的匹配原理》 一文中我们可以了解 回溯 的原理;这个回溯其实埋着危险: 灾难性回溯catastrophic backtracking

      正则表达式1:(a+)*

       正则表达式2:(a+)*s

这两个正则表达式看上去很相似,第二个仅仅是要求最后必须匹配为s。

 我们再分别用两个不同的字符串来匹配。

        input1:aaaaaaaaas

        input2:aaaaaaaaab

        匹配结果应该是显而易见的:

        正则表达式1和input1匹配:true 

        正则表达式1和input2匹配:true

        正则表达式2和input1匹配:true

        正则表达式2和input2匹配:false

上述是匹配结果,是没有问题的。我们关注的,是操作时间。上述四种组合的匹配时间,基本上都在1ms的级别。

但是,我们把第四种匹配组合中,匹配字符串input2修改一下,input2为10个字符,我们将它修改成20个字符:

aaaaaaaaaaaaaaaaaaaab  运行时间变成113ms

继续将它修改成30个字符:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaab  在运行过程中,已经很清楚,出现灾难了,运行时间为111231ms

这就是正则表达式的灾难性回溯。在进行匹配的时候,匹配引擎在前面的a字符的时候,匹配成功,到达b的时候,匹配失败,就会进行回溯【即从第二个a开始再来一遍】,而回溯的数量,和之前匹配的数量呈指数的增长趋势。

那么怎么解决这种问题的出现?  无解, 是的, 只能说尽量不要使用复杂的正则表达式,或者在正则之前对表达式进行一些先行判断或者处理;

相关文章

  • 正则表达式之灾难性回溯

    在《贪婪与非贪婪的匹配原理》 一文中我们可以了解 回溯 的原理;这个回溯其实埋着危险: 灾难性回溯cata...

  • 2020-03-28 正则表达式基础与高级

    史上最全正则表达式语法,文末附常用表达式! 正则表达式的回溯 总结:回溯越少效率越高

  • LeetCode-10-正则表达式匹配

    LeetCode-10-正则表达式匹配 题目说明 解法思路 1 该题的标签为回溯算法,所以采用回溯算法来解决此题,...

  • 正则表达式回溯法原理

    本文摘抄自javascript正则表达式迷你书 正则表达式是匹配模式,要么匹配字符,要么匹配位置 1. 没有回溯...

  • 随缘到了JS正则表达式,就来写点!(有不对的地方请指出来)

    所有的语言的正则表达式还有一些更强大的功能,比如 1、子表达式的索引和回溯 2、回溯引用在replace中的应用 ...

  • 正则表达式回溯法原理

    来源:正则表达式回溯法原理作者:老姚(转载已获得作者授权) 学习正则表达式,是需要懂点儿匹配原理的。而研究匹配原理...

  • 不积跬步之第四章--正则回溯法原理

    大佬的话,学习正则表达式,是需要懂点匹配原理的。而聊到匹配原理,就说道了回溯,那么什么是回溯呢?这是我们这一章要明...

  • 正则应用举例

    在写具体的案例之前,先说一个概念,正则的回溯,这个其实是正则匹配的原理,在这里给大家推荐一篇文章正则表达式回溯法原...

  • 【经验总结】- 性能优化

    正则表达式非常消耗 CPU(如贪婪模式可能会引起回溯),慎用字符串的 split()、replaceAll() 等...

  • Java正则表达式参考

    Java正则表达式入门 java正则表达式应用 深入浅出之正则表达式(一) 深入浅出之正则表达式(二) 正则表达式...

网友评论

    本文标题:正则表达式之灾难性回溯

    本文链接:https://www.haomeiwen.com/subject/bjqhvxtx.html