正则表达式变得疯狂:java.util.regex.Pattern匹配器进入了高CPU循环

正则表达式变得疯狂:java.util.regex.Pattern匹配器进入了高CPU循环,第1张

正则表达式变得疯狂:java.util.regex.Pattern匹配器进入了高CPU循环

注意pobrelkey和David Wallace的答案都是正确的,但是这里有更多解释…

该正则表达式之所以“疯狂”(标题为BTW)是因为它受到灾难性的回溯。它具有经典的

/^(A*)*$/
形式。请注意,仅当模式与目标字符串不匹配时,才会发生这种失控行为。

考虑到失控模式:

^(A*|B*|C*|D*)*$
有几种解决方法:

  • ^(A|B|C|D)*$
    -从该组中的四个替代项中删除星号(“零个或多个”量词)。
  • ^(A*+|B*+|C*+|D*+)*$
    -使每个替代的星号量词都 具有所有格 (即,将每个都更改
    *
    *+
    )。
  • ^(?>A*|B*|C*|D*)*$
    -使包含替代物的组 原子化

后两个的性能比第一个要快很多,但是所有三个都将解决“ regex wilded”问题。(是的,最好不要使用正则表达式解析HTML。)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5135466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存