我曾经有过一次回答了一个问题 https://stackoverflow.com/a/17723854/882200关于将带引号的字符串与转义引号匹配。
似乎有些情况会在 .NET 上挂起并在 Mono 上崩溃(带有OutOfMemoryException
), 例如:
var reg = new Regex(@"^""([^\\""]*(\\"")*(\\[^""])*)*""");
reg.Match("\" ");
两个问题:
1)为什么会发生这种情况?
2)如何改进这个正则表达式?我希望它保留所有“功能”。
这确实是(参见 Tim S.)这部分模式的灾难性回溯:(\\[^""])*)*
这使得世界上一切皆有可能,并导致正则表达式引擎尝试太多的可能性。 (如果您点击 Tim S. 链接,可以找到更好的插图)
另一种模式可以做到这一点:
var reg = new Regex(@"(?s)""(?>[^\\""]+|\\{2}|\\.)*""");
(这个想法是在确保允许真正的转义字符(交替的第三部分)之前匹配所有偶数个反斜杠(交替的第二部分)。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)