如果在限定符*、+、?、{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.12和2.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.14和2.15所示。