我(终于)开始学习正则表达式,并且我想知道这两个模式字符串之间有什么显着的区别。我试图匹配类似 "Title=Blah
" 的行,并将 "Title" 和 "Blah" 匹配到两个组中。
问题出现在像 "Title=The = operator
" 这样的标题上。以下是解决问题的两个选择:
^([^=]+)=(.+)$
^(.+?)=(.+)$
这两者有什么区别,无论是在性能还是功能方面?
我(终于)开始学习正则表达式,并且我想知道这两个模式字符串之间有什么显着的区别。我试图匹配类似 "Title=Blah
" 的行,并将 "Title" 和 "Blah" 匹配到两个组中。
问题出现在像 "Title=The = operator
" 这样的标题上。以下是解决问题的两个选择:
^([^=]+)=(.+)$
^(.+?)=(.+)$
懒惰的替代方法
在这种情况下,有一种比使加号变成懒惰的更好的选择。我们可以使用贪婪的加号和一个取反的字符类:<[^=]+>。之所以更好,是因为回溯。当使用懒惰的加号时,引擎必须为它试图匹配的HTML标记中的每个字符进行回溯。当使用取反的字符类时,当字符串包含有效的HTML代码时,根本不会发生回溯。回溯会减慢正则表达式引擎的速度。在文本编辑器中进行单个搜索时,您不会注意到差异。但是,如果在编写脚本时在紧密循环中重复使用这样的正则表达式,您将节省大量CPU周期...
.+?
,即无需回溯。诚然,大多数正则表达式引擎>>都<<是基于DFAs的。 - Stephen Ca?a?a?aaa
在典型(即基于DFA的)正则表达式引擎中具有复杂度为O(N**3)
。同时运行对比 '==test'