问号(?)、星号()和加号(+)是正则表达式中表示重复次数的量词:?匹配0或1次,匹配0次或多次且默认贪婪,+匹配1次或多次且默认贪婪;单独?是非贪婪量词,但作为后缀(如.*?)则使前一量词转为非贪婪。

问号(?)、星号(*)和加号(+)是正则表达式中最常用的量词,它们都表示“前面的元素出现多少次”,但具体含义和匹配行为完全不同。
问号:0 次或 1 次
? 表示前面的字符、分组或元字符可有可无,最多只匹配一次。它不贪心,但默认是“非贪婪”的(不过单个 ? 本身不涉及贪婪/非贪婪选择,只有跟在其他量词后才有此含义)。
例如:
-
colou?r匹配 color 和 colour -
https?匹配 http 和 https -
a?b匹配 b(a 出现 0 次)或 ab(a 出现 1 次),但不匹配 aab
星号:0 次或多次
* 表示前面的元素可以出现任意次数,包括零次。它默认是**贪婪匹配**,会尽可能多地匹配。
立即学习“Java免费学习笔记(深入)”;
例如:
-
ab*c匹配 ac(b 出现 0 次)、abc、abbc、abbbbbc -
.*是常见写法,匹配任意字符(除换行符外)零次或多次;常用于提取中间内容,但要注意可能过度匹配 -
\d*可匹配空字符串、0、123 等
加号:1 次或多次
+ 表示前面的元素至少出现一次,不能为零次。它也默认是贪婪的。
例如:
-
ab+c匹配 abc、abbc,但不匹配 ac -
\d+匹配一个或多个数字,不会匹配空字符串;适合提取整数 -
a+b+c+要求至少一个 a、至少一个 b、至少一个 c,如 abc、aaabbbcc
补充:贪婪 vs 非贪婪(加个 ? 的作用)
单独的 ? 是量词,但放在 * 或 + 后面时,它的作用就变了:变成**非贪婪修饰符**。
例如:
-
.*在字符串"a<b>hello</b><b>world</b>"中会匹配整个"<b>hello</b><b>world</b>"(贪婪) -
.*?则只匹配到第一个",即"<b>hello</b>"(非贪婪) - 同理:
\d+?尽可能少地匹配数字(但至少 1 位),实际中较少用,因为\d本身无法拆分
(ab)+ 匹配 ab、abab 等。










