【问题标题】:Why does regex take too long to evaluate for certain value?为什么正则表达式需要很长时间才能评估某个值?
【发布时间】:2014-08-13 08:34:09
【问题描述】:

下面是我的正则表达式:

(https?:\/\/)([a-zA-Z]{2,6}\.)*((?!.*[|!{}[\]^"*;]).)+(\.*)([a-zA-Z0-9\.\-\/\:\?&=_%#]+)+([&|?])+$

它是验证一个带有否定前瞻的 URL 以允许来自其他语言的字符。

这就是我在http://regex101.com/#javascript 测试它时发生的情况:

为了——

http://server.com/path?id=1111111 - 不匹配

http://server.com/path?id=11111111 - TIMEOUT 您的表达式计算时间过长。

http://server.com/path?id=111111111111111111111& - 匹配

观察:

当查询参数的值增加到超过一定长度时,它会超时。

但是对于匹配的 URL,参数值的长度并不重要。

为什么超时超过一定长度?我需要修改正则表达式的哪一部分?

注意:RegEx 要求 URL 以 ?& 结尾

提前致谢。

编辑:

我需要的是一个验证所有标准的正则表达式(例如 www.xyz.com 或 someip:port 后跟路径参数和/或查询参数, 等)网址。它也应该支持其他语言的字符。 通过额外的验证来强制 URL 以 ?&.

【问题讨论】:

  • 你能解释一下你的正则表达式试图实现什么吗? negative look-ahead to allow characters from other languages,我不明白你是如何实现它的。您的正则表达式的某些部分明显错误。
  • @DhrubajyotiGogoi 感谢您的回复。实际上,这是我正在根据需要更新的现有 RegEx。 ((?!.*[|!{}[\]^"*;]).)+ 这部分正则表达式带有负前瞻,允许除 [] 内的所有字符。
  • ((?!.*[|!{}[\]^"*;]).)+ 这本身就很矛盾。负前瞻开头的.* 和前瞻后的. 不是矛盾吗?
  • 你的意思是"you do not want any character ahead and still want a character ahead"
  • 另外关于你为什么需要很长时间的问题。由于表达式的性质,正则表达式引擎花费大量时间来查找匹配项,最终超时。

标签: javascript regex regex-negation regex-lookarounds


【解决方案1】:

这是我能想到的最好的:

\b([\d\w\.\/\+\-\?\:]*)((ht|f)tp(s|)\:\/\/|[\d\d\d|\d\d]\.[\d\d\d|\d\d]\.|www\.|\.tv|\.ac|\.com|\.edu|\.gov|\.int|\.mil|\.net|\.org|\.biz|\.info|\.name|\.pro|\.museum|\.co)([\d\w\.\/\%\+\-\=\&\?\:\\\"\'\,\|\~\;]*)\b

JSFiddle:(我用别人的demo测试过:)

http://jsfiddle.net/3AE9p/

当然这还不完整,但它非常接近您想要和期望的!

【讨论】:

  • 也会看看的。谢谢。
【解决方案2】:

([a-zA-Z0-9\.\-\/\:\?&=_%#]+)+ 中的(…+)+ 导致catastrophic backtracking。删除其中一个优点应该会有所帮助。

【讨论】:

  • 你的眼睛真的像鹰一样。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多