我曾经answered a question关于将带引号的字符串与转义引号匹配。
似乎有些情况挂在.NET上并在Mono上崩溃(使用OutOfMemoryException
),例如:
var reg = new Regex(@"^""([^\\""]*(\\"")*(\\[^""])*)*""");
reg.Match("\" ");
两个问题:
1)为什么会发生这种情况?
2)如何改善这个正则表达式?我希望它保留所有“功能”。
答案 0 :(得分:0)
确实(参见Tim S.)对你的模式的这一部分进行了灾难性的回溯:(\\[^""])*)*
它允许世界上所有可能的事情,并使正则表达式引擎尝试太多的可能性。 (如果你关注Tim S.链接,可以找到更好的插图)
另一种模式:
var reg = new Regex(@"(?s)""(?>[^\\""]+|\\{2}|\\.)*""");
(想法是匹配所有偶数反斜杠(交替的第二部分)以确保允许真正的转义字符(交替的第三部分)。)