【发布时间】:2011-10-04 00:02:36
【问题描述】:
在过去的一周里,我一直在使用 regex 做一些工作,并取得了很大的进步,但是,我仍然相当 n00b。我有一个用 C# 编写的正则表达式:
string isMethodRegex =
@"\b(public|private|internal|protected)?\s*(static|virtual|abstract)?"+
@"\s*(?<returnType>[a-zA-Z\<\>_1-9]*)\s(?<method>[a-zA-Z\<\>_1-9]+)\s*\"+
@"((?<parameters>(([a-zA-Z\[\]\<\>_1-9]*\s*[a-zA-Z_1-9]*\s*)[,]?\s*)+)\)";
IsMethodRegex = new Regex(isMethodRegex);
由于某种原因,当调用正则表达式 IsMethodRegex.IsMatch() 时,它会在以下字符串上挂起 30 多秒:
"\t * Returns collection of active STOP transactions (transaction type 30) "
有谁知道 Regex 的内部是如何工作的,以及为什么在匹配这个字符串而不是其他字符串时会这么慢。我玩过它,发现如果我去掉 * 和括号,它就可以正常运行。也许正则表达式写得不好?
任何帮助将不胜感激。
【问题讨论】:
-
你试过编译正则表达式吗?其中一个构造函数重载提供了这种能力。
-
@Steve:我刚刚测试了自己,编译后仍然需要很长时间。我可以在我自己的机器上用 LinqPad 重现很长时间。
-
我知道这不是重点,但你的正则表达式对我来说看起来很脆弱。不知何故,我认为性能是你的问题中最少的。
-
解释一下你试图解决的实际问题怎么样?
-
这可能会提供一些关于注意事项的见解:regular-expressions.info/catastrophic.html
标签: c# regex performance