何时选择[^ x] *或。*?

时间:2013-11-26 10:31:31

标签: regex

假设我有一个较长字符串中的子字符串,如(...)aaabaacaaaaaXaaaadaeaa(...),我希望将aaabaacaaaaaX匹配或替换为分隔符

我现在可以使用(。*?)X在X之前找到字符串,或者我可以使用([^ X] *)来查找它。我也可以使用负面预测但我不认为在这种情况下是必要的。 那么两个(或三个)选项中的哪一个是更好的技术来获得我想在这种情况下匹配的组?

2 个答案:

答案 0 :(得分:2)

举一个非常简单的例子:

www\..*?\.com
www\.[^.]*\.com

第一个匹配任何包含www..com的输入,其间包含任何内容。第二个匹配中间没有www.的{​​{1}}和.com

第一个匹配:. 第二个不会。

如果该部分绝对不能包含该字符,则仅使用否定类。

答案 1 :(得分:2)

  • .*?被称为懒惰量词。
  • [^X]*被称为贪婪否定量词

尽可能使用否定[^X],因为它不会导致回溯。当然,如果您的输入文字可以包含字母X,那么您别无选择,只能使用.*?

我正在从@ridgerunner最近的评论中复制此文本:

  

表达式:[^X)]*肯定比.*?更高效   除Perl之外的所有语言(其正则表达式引擎都很高   针对懒星点星表达式进行了优化)。表达式.*?必须   在每个角色位置停止和回溯一次   “颠簸”,而贪婪的量词适用于否定的   字符类表达式可以在单个表中使用整个块   一步,没有回溯。