Regex.Replace上的“或”运算符是否存在理论表达式大小限制 例如Regex.Replace(“abc”,“(a | c | d | e ...继续说500000个元素)”,“zzz”)?
关于.NET实现的任何stackoverflowException?
由于
答案 0 :(得分:3)
虽然每个正则表达式引擎都有自己的实现限制,但没有理论限制。在这种情况下,由于您使用的是.NET,因此限制是由于.NET运行时可以使用的内存量。
有一百万个alernations的正则表达式对我来说很好:
string input = "a<142>c";
var options = Enumerable.Range(0, 1000000).Select(x => "<" + x + ">");
string pattern = string.Join("|", options);
string result = Regex.Replace(input, pattern, "zzz");
结果:
azzzc
虽然很慢。将选项数量增加到1000万可以得到OutOfMemoryException
。
您可能会从另一种方法中受益。
答案 1 :(得分:2)
正则表达式的工作方式意味着所描述的简单a|b|c.....|x|y|z
表达式的内存要求和性能也不算太差,即使对于大量变体也是如此。
但是,如果你的表达式甚至比那个稍微复杂一点,你可能会导致表达式以指数方式失去性能,并且大量增加其内存占用,因为像这样的大量or
选项可能会导致如果表达的其他部分不能立即匹配,则必须进行大量的回溯。
因此,您可能希望谨慎行事。即使现在有效,只需要进行一次小而相对无辜的改变就可以使整个事情停滞不前。