2012-01-18 6 views
1

このコードは無限ループでハングします。RegularExpressions.Matchが無限ループでハングする

なぜでしょうか?これは.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)"">") 
+0

あなたはそれを試して/キャッチして例外を得ることができますか? – user1231231412

+0

Try/Catchブロックで実行しても例外はありません。 – Jiri

+0

ジリー、それはハングアップしない、それはちょうど非常にyyyyy loooongの時間がかかります。だからバグではありません、代わりに正規表現を最適化する方法を求める質問を編集する必要があります。 –

答えて

2

他にも言及したように、過剰なバックトラックが原因です。このトピックに関する良い記事はここにあります:Catastrophic Backtracking

あなたのオプションは以下のとおりです。

  1. は壊滅的なバックトラックを引き起こす可能性があり、ネストされた数量せずに、より良いあなたのパターンを定義します。これには、問題をよりよく定義する必要があります。可能な入力のリストを作成し、おそらくより良いパターンが現れます。あなたのパターンは、許可されているものと許可されていないものを指定することによって、あまりにも多くをしようとしているように見えます。場合によっては、どちらか一方を行うことでパターンを単純化することも可能です。あなたは何を一致させたいですか?

  2. .NET 4.5の新しいRegexタイムアウト機能を使用します(公式リリース後)。これはあなたの問題に対する直接的な解決策ではありませんが、貧弱なパターンによって引き起こされるマッチをぶら下げるのを助けます。私はここでそれをカバーしました:How do I timeout Regex operations to prevent hanging in .NET 4.5?