2017-05-30 98 views
0

我有代碼:Regex.IsMatch凍結

string pattern = 
      @"^(((://)?([A-Za-z0-9\.,\(\)\?\[email protected]#$%\^&\*=_\+\[\]\{\}\\""';><~\| \n\t:]+(/|://)?)*[A-Za-z0-9\.,\(\)\?\[email protected]#$%\^&\*=_\+\[\]\{\}\\""';><~\| \n\t]))$"; 

Regex regex = new Regex(pattern); 

string message = 
      "THINGS IN THIS MESSAGE ARE\r\n"; 

regex.IsMatch(message); // <- freezes 

Console.ReadKey(); 

它凍結在regex.IsMatch。當我改變時

message = "THINGS IN THIS MESSAGE ARE\n"; 

regex.IsMatch返回值。

IsMatch爲什麼會凍結?

+0

在我的電腦用了〜24秒內運行,你的模式是非常複雜的,需要大量的計算。你想匹配什麼?也許我們可以簡化它。 –

+3

任何時候一個正則表達式似乎凍結它通常是由於所謂的[災難性回溯](http://www.regular-expressions.info/catastrophic.html)。這可以通過降低正則表達式的複雜度並引入更好的錨點和/或量詞提示來加以改進。 – Phylogenesis

+0

http://www.regular-expressions.info/floatingpoint.html和http://www.regular-expressions.info/catastrophic.html –

回答

0

在上節中添加\r對我有用。它應該是:

... | \n\r\t]))$ 

不:

... | \n\t]))$ 

測試:

string pattern = 
    @"^(((://)?([A-Za-z0-9\.,\(\)\?\[email protected]#$%\^&\*=_\+\[\]\{\}\\""';><~\| \n\t:]+(/|://)?)*[A-Za-z0-9\.,\(\)\?\[email protected]#$%\^&\*=_\+\[\]\{\}\\""';><~\| \n\r\t]))$"; 
Regex regex = new Regex(pattern); 
string message = "THINGS IN THIS MESSAGE ARE\r\n"; 
regex.IsMatch(message); 
+0

模式無法更改。它來自xsd文件。 '\ r'是不允許的。 –