我(最后)开始学习正则表达式,我想知道这两个模式字符串之间是否有任何明显的区别。我正在尝试匹配“Title=Blah
”等行,并将“标题”和“Blah”分为两组。
问题来自“Title=The = operator
”等标题。以下是解决问题的两种选择:
^([^=]+)=(.+)$
^(.+?)=(.+)$
两者之间是否存在性能差异或功能方面的差异?
答案 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'