正则表达式比较消耗了大量资源吗?

时间:2008-10-22 08:06:47

标签: regex

我不知道,但是如果你使用非常复杂的正则表达式,你的机器会遭受很大的减速吗? 比如最近提出的着名电子邮件验证模块?可在此处找到RFC822

更新:对不起我不得不匆匆问这个问题无论如何我发布了我正在谈论的电子邮件正则表达式的链接

9 个答案:

答案 0 :(得分:3)

它在很大程度上取决于个人正则表达式:后视或前瞻等功能可能会非常昂贵,而简单的正则表达式在大多数情况下都可以使用。

关于http://www.regular-expressions.info/的教程提供了性能建议,因此这可以是一个良好的开端。

答案 1 :(得分:3)

正则表达式通常实现为两个算法之一(NFADFA),它们对应于两个不同的FSM。不同语言甚至同一语言的不同版本可能具有不同类型的正则表达式。当然,一些正则表达式在一个中运行得更快,而另一些正则表达式在另一个中运行得更快。如果它真的很重要,您可能想要找到实现什么类型的正则表达式FSM。

我不是这里的专家。我从杰弗里·E·弗里德尔(Jeffrey E. F. Friedl)的阅读Mastering Regular Expressions得到了这一切。你可能想看一下。

答案 2 :(得分:2)

还取决于您如何优化查询,并了解正则表达式的内部工作。

例如,使用否定字符类可以节省引擎回溯字符的成本(即/&lt; [^&gt;] +&gt; /而不是/<。+?&gt; /)(*) 。小小的比赛中的小小,但是当你必须在一大块文本中进行匹配时,可以节省很多周期。

还有许多其他方法可以节省正则表达式操作中的资源,因此性能可能会有很大差异。

答案 3 :(得分:2)

您可能会对以下文章感兴趣:Regular Expression Matching Can Be Simple And FastUnderstanding Regular Expressions

唉,很容易编写效率低下的RE,这些RE在成功时可以很快匹配,但如果找不到匹配则可以查找几个小时,因为引擎愚蠢地尝试在长字符串的每个位置进行长匹配!

这方面有一些方法,比如在可能的情况下进行锚定,尽可能避免贪婪等等。

请注意,巨型电子邮件表达式不是最新的,并不一定很慢:简短的表达式可能比更复杂的表达式更慢!

另请注意,在某些情况下(如电子邮件,精确地说),使用混合使用正则表达式和代码处理案例(如拆分@,处理不同的案例)可能更有效(并且可维护!)部分以“或不是,第二部分是IP地址或域等”开始。

正则表达式不是能够完成所有工作的终极工具,但它是一个非常有用的工具,值得掌握!

答案 4 :(得分:1)

这取决于你的正则表达式引擎。正如here (Regular Expression Matching Can Be Simple And Fast)所解释的那样,根据实施情况,性能可能会有一些重要的差异。

答案 5 :(得分:1)

一般来说,你不能谈论正则表达式,而不能谈论一般的代码。

正则表达式本身就是一些小程序。正如任何给定的程序可能快或慢,任何给定的正则表达式可能是快或慢。

但要记住的一件事是,正则表达式处理程序已经过优化,无法完成其工作并快速运行正则表达式。

答案 6 :(得分:0)

我曾经做过一个分析了大量文本的程序(一个很大的代码库,> 300k行)。首先我使用正则表达式,但是当我切换到使用常规字符串函数时,它获得了更快的速度,比如占用正则表达式版本的40%的时间。所以当然,这取决于我的事情要快得多。

答案 7 :(得分:0)

一旦我写了一个贪婪 - 当然是偶然的:-) - 一个多行正则表达式并让它搜索/替换10 * 200 GB的文本文件。这很慢......所以这取决于你写的东西,以及你检查的内容。

答案 8 :(得分:0)

取决于表达式的复杂性以及表达式使用的语言。

在JavaScript中;你必须优化一切。在C#中;没那么多。