【发布时间】:2012-01-07 23:25:46
【问题描述】:
我有一个程序在相当长的文本集(5-15 个文本,每个文本约 1000 个单词)上运行大量正则表达式(10+)
每次完成后,我都觉得我在某处忘记了 Thread.Sleep(5000)。正则表达式真的很重处理器吗?看起来计算机应该在一毫秒内完成这样的任务。
我应该尝试将所有正则表达式组合成一个怪物表达式吗?会有帮助吗?
谢谢
编辑:这是一个现在运行的正则表达式:
Regex rgx = new Regex(@"((.*(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*).*)|(.*(keyword1)).*|.*(keyword2).*|.*(keyword3).*|.*(keyword4).*|.*(keyword5).*|.*(keyword6).*|.*(keyword7).*|.*(keyword8).*|.*(count:\n[0-9]|count:\n\n[0-9]|Count:\n[0-9]|Count:\n\n[0-9]|Count:\n).*|.*(keyword10).*|.*(summary: \n|Summary:\n).*|.*(count:).*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
Regex regex = new Regex(@".*(\.com|\.biz|\.net|\.org|\.co\.uk|\.bz|\.info|\.us|\.cm|(<a href=)).*", RegexOptions.Compiled | RegexOptions.IgnoreCase);
这是相当大的,毫无疑问。这个想法是,如果它到达任何关键字或链接,它将只删除围绕它的整个段落。
【问题讨论】:
-
如果它冻结了 gui,你应该在后台线程上运行这些 RegExes。
-
正则表达式可能很昂贵。他们的语法可以给人一种他们正在发挥魔力的错觉,但在幕后他们并不总是有效的。如果可能,您应该
Compile正则表达式以提高性能。 -
您可以尝试使用
Parallel.For、Parallel.ForEach、Parallel.Invoke(在System.Threading.Tasks命名空间下)并行化您的代码 -
那么……正则表达式在哪里?哪些在哪些词集上较慢? (5、10、15 和 1000 是小数字)。剖析显示什么? (10 * 15 是相对较少的运行次数。)
-
向我们展示您的正则表达式和代码。我们无法在没有看到他们的情况下回答您的问题。运行 10 个正则表达式,每个 15 次应该很快。但是,如果您的表达结构不佳,则可能需要非常非常长的时间。
标签: c# regex performance