Regex.Replace中的“或”运算符是否存在理论表达式大小限制

时间:2011-09-23 12:29:57

标签: .net regex limit

Regex.Replace上的“或”运算符是否存在理论表达式大小限制 例如Regex.Replace(“abc”,“(a | c | d | e ...继续说500000个元素)”,“zzz”)?

关于.NET实现的任何stackoverflowException?

由于

2 个答案:

答案 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选项可能会导致如果表达的其他部分不能立即匹配,则必须进行大量的回溯。

因此,您可能希望谨慎行事。即使现在有效,只需要进行一次小而相对无辜的改变就可以使整个事情停滞不前。