2.5 限定符(4)

来源:互联网 发布:中国单挑全世界知乎 编辑:程序博客网 时间:2024/06/16 09:52

  如果在限定符*+?{n}{n,}{n,m}之后再添加一个字符“?”,则表示尽可能少的重复字符“?”之前的限定符号的重复次数,这种方式匹配被称为懒惰匹配。与之相对应的是贪婪匹配,即仅仅使用单个限定符*+?{n}{n,}{n,m}的匹配。常用的懒惰限定符如表2-6所示。

2-6 常用懒惰限定符

字符或表达式

说明

*?

尽可能少地使用重复的第一个匹配。

+?

尽可能少地使用重复但至少使用一次。

??

使用零次重复(如有可能)或一次重复。

{n}?

等同于{n}

{n,}?

尽可能少地使用重复但至少使用n次。

{n,m}?

介于n次和m次之间、尽可能少地使用重复。

  以下正则表达式匹配以字母a开头的、以字母b结束的、最长的字符串。此时,这是一种贪婪匹配。

a.*b                                                                      48

  以下正则表达式匹配以字母a开头的、以字母b结束的、最短的字符串。此时,这是一种懒惰匹配。

a.*?b                                                                      49

  如果将正则表达式a.*b应用于字符串“aabab”,则匹配字符串“aabab”。如果将正则表达式a.*?b应用于字符串“aabab”,则匹配字符串“aab”和字符串“ab”,而不会匹配字符串“aabab”。

使用工具Regex Tester分别测试正则表达式(48)和(49),结果分别如图2.122.13所示。

 

                     

 

 

 

  以下正则表达式匹配以字母a开头的、以字母b结束的、长度至少为3的字符串。此时,这是一种贪婪匹配。

a.+b                                                                      50

  以下正则表达式匹配以字母a开头的、以字母b结束的、长度至少为3的字符串。此时,这是一种懒惰匹配。

a.+?b                                                                      51

  正则表达式a.+?b在匹配过程中,字母a和字母b之间的字符串实际上只重复了1次。如果将正则表达式a.+b应用于字符串“avbab”,则匹配字符串“avbab”。如果将正则表达式a.+?b应用于字符串“avbab”,则匹配字符串“avb”,而不会匹配字符串“avbab”。使用工具Regex Tester分别测试正则表达式(50)和  (51),结果分别如图2.142.15所示。