正则量词决定匹配成败:匹配0次或多次(贪婪,默认吞尽)、+要求至少1次、?表示0或1次,且?跟在+后可转为非贪婪;{n}等花括号实现精准计数,配合\b等边界符防误匹配。

正则里的量词不是“多匹配几个就行”,而是决定匹配成败的关键开关。用错一个符号,可能整段文本全错位——尤其在提取标签、数字、URL或日志字段时。
星号 *:零次或无限次,但默认贪得无厌
* 表示“前面的元素可以出现 0 次、1 次、100 次”,看起来很宽松,但实际行为很强势:它会一路吞到不能再吞为止,再回头试探。
- 比如
/a.*b/在字符串"a123b456b"中,匹配的是"a123b456b"(整个串),而不是更自然的"a123b" - 想让它“见好就收”,写成
/a.*?b/——加个 ? 就切换为非贪婪,这时才只取第一个b前的内容 - 注意:
*前必须有明确的“前一个元素”,不能单独写/*/(语法错误),要匹配字面星号得写\*
加号 +:至少一次,拒绝空匹配
+ 和 * 很像,区别只有一点:+ 要求前面的元素**至少出现一次**,不接受“零次”。
-
/ab+/可以匹配"ab"、"abb",但不匹配"a" - 常见误用:想匹配“可能带括号的数字”,写成
/\(\d+\)/——这要求左右括号都存在;如果括号是可选的,得拆开处理,比如/?\d+/?不行,应改用/\(?(\d+)\)?/ - 同样支持非贪婪:
/.+?/比/.+/更安全,尤其在跨行或含分隔符的文本中
问号 ?:不是“可能有”,而是“最多一次”
? 容易被误解为“可有可无”的模糊提示,其实它是严格的**0 或 1 次**控制符,且本身也支持非贪婪变体(??)。
-
/colou?r/匹配"color"和"colour",因为u出现 0 或 1 次 -
/https?/是简写技巧:匹配"http"或"https",s最多一次 - 当它跟在其他量词后面(如
*?、+?、??),作用完全改变——此时?不再表示“次数”,而是开启非贪婪模式
花括号 {}:精准计数,防误匹配的定海神针
靠 *、+、? 太粗放?{} 提供毫米级控制,是验证格式(如手机号、身份证、时间)的首选。
-
\d{5}只匹配连续 5 位数字,不会把"123456"里的任意 5 位都抓出来(除非加全局标志g) -
\d{3,5}匹配 3~5 位数字,"12"不中,"123"中,"12345"中,"123456"只取前 5 位(贪婪下) - 加
?变非贪婪:\d{3,5}?会优先尝试 3 位,满足即停;适合嵌套解析或避免过长截断 - 边界很重要:
\b\d{5}\b确保前后不是数字,防止从"123456"中抽出"12345"











