正则表达式比较

时间:2009-08-01 02:16:54

标签: regex

我(最后)开始学习正则表达式,我想知道这两个模式字符串之间是否有任何明显的区别。我正在尝试匹配“Title=Blah”等行,并将“标题”和“Blah”分为两组。

问题来自“Title=The = operator”等标题。以下是解决问题的两种选择:

^([^=]+)=(.+)$
^(.+?)=(.+)$

两者之间是否存在性能差异或功能方面的差异?

5 个答案:

答案 0 :(得分:5)

第一个要求在=之前至少有一个非=字符才能匹配,而第二个字符不匹配;它会匹配领先的==

至于表现,我没有预料到有意义的差异,但如果你真正关心,唯一要做的就是描述它。我将通过编写一对脚本来完成,每个脚本运行其中一个方法几十万次,并使用Unix time命令对它们进行计时。

答案 1 :(得分:3)

第一个要求在=之前至少有一个非=字符才能匹配,而第二个不要;它会匹配领先的==。

根据您的内容,第一个可以运行得更快。 Here's why

  

懒惰的替代
  在这   情况下,有一个更好的选择   加上懒惰。我们可以用一个   贪婪加上和否定的角色   class:< [^ =] +>。这是为什么   更好的是因为回溯。   当使用懒惰加,引擎   必须回溯每个角色   它正在尝试的HTML标记   比赛。使用否定时   角色类,没有回溯   在字符串包含时发生   有效的HTML代码。回溯速度减慢   在正则表达式引擎下。你不会   做一个时注意到差异   单一搜索文本编辑器。但   您将节省大量的CPU周期   反复使用这样的正则表达式时   你是一个脚本的紧密循环   写...

答案 2 :(得分:1)

在性能方面,它(理论上)将取决于您正在使用的正则表达式的实现。虽然这可能不是这种情况,但有问题的正则表达式的实现之间可能存在深刻的差异。例如,应用于由N“a”组成的字符串的正则表达式a?a?a?aaa使用典型(即基于DFA的)正则表达式引擎,具有O(N**3)的复杂度。

有关更多信息,请参阅Russ Cox的“Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)”。

答案 3 :(得分:1)

一个很好的问题,但遗憾的是它取决于正则表达式引擎。您必须对其进行分析以了解运行时的差异。好吧,我想如果你有引擎的源代码,那么你可以做出决定,但我假设情况并非如此。

答案 4 :(得分:0)

针对'==test'

运行两者