2016-04-09 43 views

回答

5

这是一个非贪婪匹配。在[AB]*?中,正则表达式只寻找[AB],以使整个正则表达式匹配搜索的字符串,而贪婪版本[AB]*寻找尽可能多的出现次数。这是Perl的regexes的一个特性,因此可以在PCRE(Perl Compatible Regular Expressions)(参见repetition)和其他系统中找到Perl的定义。

的PCRE页面给出了一个例子:

的其中[贪婪]给出问题的经典例子是尝试匹配C语言的注释。这些出现在/**/之间,并且在评论中可能出现个别的*/个字符。试图通过应用模式来匹配C注释:

/\*.*\*/ 

字符串

/* first comment */ not comment /* second comment */ 

失败,因为它由于.*项目的贪吃整个字符串匹配。

如果一个量词后跟一个问号,它就不再是贪婪,而是次可能的最小数量相匹配,因此模式

/\*.*?\*/ 

做正确的事与C注释。

2

Jonathan已经解释了区别,但这里有一个例子可以帮助你理解这里发生了什么。

鉴于字符串 “9AB”:

  • ([0-9][AB]*?)比赛唯一的 “9A”,因为它很快将停止为 “A” 匹配(懒惰)

  • ([0-9][AB]*)整个字符串匹配(“9AB “),因为它消耗‘A’和成功匹配以下‘B’(贪婪)

注意,第二个将匹配位数,随后零个或多个(无限制)数量的“A”或“B”。

+0

谢谢你的例子,Maroun。我在Python中试过这个例子,而不是得到你的建议,我得到了“9”的结果。这是我的代码: x = re.search(r'[0-9] [AB] *?','9AB') print x.group(0) – akaii

+0

哪一个是正确的结果,“9 “或”9A“? – akaii

+2

9是正确的,因为允许'[AB]'的零匹配。当贪婪的量词后面有些东西时,贪婪主要是重要的。 –