RegularExpressions.Match在无限循环中挂起

时间:2012-01-18 13:44:01

标签: .net regex vb.net

此代码在无限循环中挂起。

任何想法为什么会这样?这是.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)"">")

1 个答案:

答案 0 :(得分:2)

正如其他人所说,这是由于过度回溯。关于这个主题的好文章可以在这里阅读:Catastrophic Backtracking

您的选择是:

  1. 更好地定义您的模式,没有可能导致灾难性回溯的嵌套量词。这需要您更好地定义问题。建立一个可能的输入列表,也许会出现更好的模式。通过指定允许的内容和不允许的内容,您的模式看起来像是在尝试做太多。有时可以通过做一个或另一个来简化模式。你想要匹配什么?

  2. 使用.NET 4.5的新Regex超时功能(一旦正式发布)。虽然这不是您问题的直接解决方案,但它确实有助于防止因模式不佳而导致的挂机问题。我在这里介绍了这一点:How do I timeout Regex operations to prevent hanging in .NET 4.5?

相关问题