2017-05-30 53 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'是不允许的。 –