【问题标题】:Why does this Regex time out?为什么这个正则表达式超时?
【发布时间】:2014-09-05 04:30:55
【问题描述】:

这可能不是 Stackoverflow 的理想问题,如果我真的违反了指导方针(例如“过于本地化”),请抱歉。但这是一个非常有趣的问题:

我有以下正则表达式(更简单的 URL 匹配版本):

\A(http(s)?:\/\/)?(([\da-z\.-]+)\.([a-z]{2,6})(\.([a-z]{2,6}))?([\/\w \.-]*)*\/?)\z

现在如果我测试这个字符串(不匹配,因为特殊字符):

http://t3n.de/news/nokia-lumia-930-test-560264/?utm_source=feedburner+t3n+News+12.000er&utm_medium=feed&utm_campaign=Feed%3A+aktuell%2Ffeeds%2Frss+%28t3n+News%29

像这样(只是为了确保我没有犯明显的错误):

str = 'http://t3n.de/news/nokia-lumia-930-test-560264/?utm_source=feedburner+t3n+News+12.000er&utm_medium=feed&utm_campaign=Feed%3A+aktuell%2Ffeeds%2Frss+%28t3n+News%29'
str.match /\A(http(s)?:\/\/)?(([\da-z\.-]+)\.([a-z]{2,6})(\.([a-z]{2,6}))?([\/\w \.-]*)*\/?)\z/i

该命令永远运行。由于字符串不匹配,它不应该返回 nil 吗?我使用的是最新版本的 ruby​​,但在 Rubular 上也会出现这种情况:http://rubular.com/r/2ajABaqmTE

jarvis:~ rudolf$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]

任何想法可能导致这种情况?我是否发现了 Ruby 错误或我遗漏了什么?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    在你的正则表达式中,有这样的:

    ([\/\w \.-]*)*
    

    这会导致正则表达式引擎创建许多它可能回溯到的状态。您可以安全地删除最后一个*

    ([\/\w \.-]*)
    

    【讨论】:

    • . 不应该被转义,并且空间是不必要的
    • @pguardiario,不是真的,. 不需要 被转义,但这没什么区别:[.][\.] 都匹配文字“。 ”。并且文字空间不能被删除:那么空间将不再匹配。
    【解决方案2】:

    在我看来,这部分中的第二个* ([\/\w \.-]*)* 是多余的,会导致大量的回溯。删除它,它工作正常:([\/\w \.-]*)

    您有很多捕获组,如果您不打算使用它们,您可能也想删除它们,但这不会产生太大影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多