正则表达式崩溃rails应用程序

gre*_*and 1 regex ruby-on-rails

我有一个正则表达式验证网址

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/
Run Code Online (Sandbox Code Playgroud)

虽然我知道这是不正确的,例如它不允许哈希符号,而不是抛出验证错误,它只是崩溃应用程序.它似乎也崩溃了一个独立的正则表达式测试器.

用于测试的网址是http://www.wmagazine.com/celebrities/2012/10/jennifer-lawrence-actress-katniss-everdeen-hunger-games-cover-story-ss#slide=1

任何人都可以解释为什么?

代码上下文是在模型中使用的,用于验证用户输入的URL以呈现到页面上

validates :source_link, :format => { :with => /(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/,
                                   :message => 'Only valid urls allowed' }, :if => :apply_validations?
Run Code Online (Sandbox Code Playgroud)

ste*_*ema 8

崩溃的问题在这里:

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/
                                                 ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

你正在嵌套量词,正则表达式有太多的可能性来找到有效的匹配.这被称为灾难性回溯

这匹配完全相同的字符串:

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)\/?$)/
Run Code Online (Sandbox Code Playgroud)

当它不匹配时会更快失败.