为什么这个正则表达式会变慢?可以更快吗?

时间:2012-01-12 20:00:34

标签: .net regex

re = new Regex ((.*?)someliteraltext(.*?moreliteral), RegexOptions.Singleline);
re.Match(c);

请注意,使用了Singleline,因此“。”匹配换行符。

我在大约100k个字符的文本块上运行它并运行几分钟。

可以更快吗?

2 个答案:

答案 0 :(得分:3)

我同意评论说最有可能放慢速度的是开始(。*?)。如果你在第一个“someliteraltext”前面有1000个字符,那就是正则表达式那部分的1001个匹配。 @CodeInChaos建议用^作为前缀(字符串的开头)是限制这些匹配的快速方法。如果这是不可接受的,你需要解释更多你想要做的事情,以获得更好的答案。

答案 1 :(得分:2)

这很慢,因为它需要大量的回溯。这篇文章:

http://www.regular-expressions.info/engine.html

可能会让你知道它正在做多少工作。

正如@Wrikken建议的那样,删除最初的“(。*?)”。此捕获组将捕获从字符串开头到“someliteraltext”的所有内容。

或者,使用“IndexOf”查找“someliteraltext”,然后使用“moreliteral”。那应该更快。