假设我有一个较长字符串中的子字符串,如(...)aaabaacaaaaaXaaaadaeaa
(...),我希望将aaabaacaaaaa
与X
匹配或替换为分隔符
我现在可以使用(。*?)X在X
之前找到字符串,或者我可以使用([^ X] *)来查找它。我也可以使用负面预测但我不认为在这种情况下是必要的。
那么两个(或三个)选项中的哪一个是更好的技术来获得我想在这种情况下匹配的组?
答案 0 :(得分:2)
举一个非常简单的例子:
www\..*?\.com
www\.[^.]*\.com
第一个匹配任何包含www.
和.com
的输入,其间包含任何内容。第二个匹配中间没有www.
的{{1}}和.com
。
第一个匹配:.
第二个不会。
如果该部分绝对不能包含该字符,则仅使用否定类。
答案 1 :(得分:2)
.*?
被称为懒惰量词。[^X]*
被称为贪婪否定量词尽可能使用否定[^X]
,因为它不会导致回溯。当然,如果您的输入文字可以包含字母X
,那么您别无选择,只能使用.*?
我正在从@ridgerunner最近的评论中复制此文本:
表达式:
[^X)]*
肯定比.*?
更高效 除Perl之外的所有语言(其正则表达式引擎都很高 针对懒星点星表达式进行了优化)。表达式.*?
必须 在每个角色位置停止和回溯一次 “颠簸”,而贪婪的量词适用于否定的 字符类表达式可以在单个表中使用整个块 一步,没有回溯。