【发布时间】:2012-01-18 13:44:00
【问题描述】:
此代码在无限循环中挂起。
任何想法为什么会这样?这是.NET中的错误吗?我能做点什么吗?
Dim urlRegex As New
Regex("((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|ftp[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»“”‘’]))",
RegexOptions.IgnoreCase)
Dim match As System.Text.RegularExpressions.Match = urlRegex.Match("<a ""javascript:window.Add(location.href,document.title)"">")
【问题讨论】:
-
你能在它周围抛出一个 try/catch 看看是否有任何异常吗?
-
在 Try/Catch 块中执行时没有异常。
-
Jiri,它不会挂起,只是需要很长的时间。所以这不是错误,您应该编辑您的问题以询问优化正则表达式的方法。
-
元骑士:你确定吗?它运行了一夜并没有完成。
-
您的问题几乎肯定与回溯有关。在此处阅读 MSDN 文章msdn.microsoft.com/en-us/library/gg578045.aspx#Backtracking。如果这有意义,请尝试实施它。如果它没有(即使它确实如此),为了未来的编码人员,包括你未来的自己,将你的正则表达式重写为更简单的东西,可能是两个或三个正则表达式。找到一个可以定位的较大模式,提取子字符串,然后解析较小的部分。 @Meta-Knight 是对的,在我的机器上完成了大约 5 分钟。