量词的正则表达式组合*?

时间:2016-04-09 21:03:00

标签: regex

量词*?的这种组合是什么意思?

将此用作以下示例:

([0-9][AB]*?)

2 个答案:

答案 0 :(得分:5)

这是一场非贪婪的比赛。在[AB]*?中,正则表达式根据需要查找少量[AB],以使整个正则表达式与搜索到的字符串匹配,而贪婪版本[AB]*查找尽可能多的出现次数。它是Perl的regexes的一个特性,因此可以在PCRE(Perl兼容正则表达式)(参见repetition)和其他系统中查看Perl的定义。

PCRE页面给出了一个例子:

  

[贪婪]给出问题的典型例子是尝试匹配C程序中的注释。它们显示在/**/之间,在评论中,可能会显示单个*/个字符。尝试通过应用模式来匹配C注释:

/\*.*\*/
     

到字符串

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

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

     

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

/\*.*?\*/
     

对C评论做了正确的事。

答案 1 :(得分:2)

乔纳森已经解释了这个区别,但这里有一个例子可以帮助你理解这里发生的事情。

给出字符串“9AB”:

  • ([0-9][AB]*?)仅匹配“9A”,因为只要“A”匹配(懒惰)就会停止

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

请注意,第二个匹配一个数字,后跟零个或多个(无限制)数字“A”或“B”。