正则表达式匹配没有完成

时间:2013-11-25 15:23:50

标签: c# .net regex mono

我曾经answered a question关于将带引号的字符串与转义引号匹配。

似乎有些情况挂在.NET上并在Mono上崩溃(使用OutOfMemoryException),例如:

var reg = new Regex(@"^""([^\\""]*(\\"")*(\\[^""])*)*""");
reg.Match("\"                               ");

两个问题:

1)为什么会发生这种情况?

2)如何改善这个正则表达式?我希望它保留所有“功能”。

1 个答案:

答案 0 :(得分:0)

确实(参见Tim S.)对你的模式的这一部分进行了灾难性的回溯:(\\[^""])*)*它允许世界上所有可能的事情,并使正则表达式引擎尝试太多的可能性。 (如果你关注Tim S.链接,可以找到更好的插图)

另一种模式:

var reg = new Regex(@"(?s)""(?>[^\\""]+|\\{2}|\\.)*""");

(想法是匹配所有偶数反斜杠(交替的第二部分)以确保允许真正的转义字符(交替的第三部分)。)