讲解
量词控制「前面的元素出现几次」。三个符号量词是:* 表示零次或多次(可有可无),+ 表示一次或多次(至少一个),? 表示零次或一次(可选)。比如 /abc/ 匹配 ac、abc、abbbbc,因为 b 允许 b 出现任意次包括零次;/colou?r/ 同时匹配 color 和 colour。
花括号量词更精确:{n} 恰好 n 次,{n,} 至少 n 次,{n,m} 在 n 到 m 次之间。手机号、身份证号、日期这类固定位数的场景全靠它:/^\d{4}$/ 是四位数字年份,/^1\d{10}$/ 是 1 开头的 11 位手机号。花括号里不能出现空格,\d{2, 4} 这种写法在 JavaScript 里会被整体当成普通字符,静默失效。
最重要的概念是量词的作用范围:量词只作用于「紧挨着它左边的那一个元素」——一个字符、一个字符类或一个分组。/ab+/ 里 + 只管 b,所以匹配 abbb 而不匹配 abab;想让整个 ab 重复,必须先用分组把它变成一个元素:/(ab)+/。量词默认是「贪婪」的,会尽可能多匹配,贪婪与懒惰有专门一章展开。
示例
// * 零次或多次,+ 至少一次,? 零或一次
console.assert(/^ab*c$/.test('ac')); // b 出现零次也行
console.assert(/^ab*c$/.test('abbbbc'));
console.assert(/^ab+c$/.test('ac') === false); // + 至少要有一个 b
console.assert(/^colou?r$/.test('color'));
console.assert(/^colou?r$/.test('colour'));
console.assert(/^colou?r$/.test('colouur') === false); // ? 最多一个 u
花括号精确控制次数:
console.assert(/^\d{4}$/.test('2026')); // 恰好 4 位
console.assert(/^\d{4}$/.test('202') === false);
console.assert(/^\d{2,4}$/.test('123')); // 2 到 4 位
console.assert(/^\d{2,}$/.test('12345')); // 至少 2 位
// 实战:手机号 = 1 开头共 11 位
const phone = /^1\d{10}$/;
console.assert(phone.test('13812345678'));
console.assert(phone.test('1381234567') === false); // 少一位
console.assert(phone.test('23812345678') === false); // 不是 1 开头
量词只管左边一个元素,想重复一段要先分组:
console.assert(/^ab+$/.test('abbb')); // + 只作用于 b
console.assert(/^ab+$/.test('abab') === false);
console.assert(/^(ab)+$/.test('abab')); // 分组后 ab 作为整体重复
console.assert(/^(ab)+$/.test('ab'));
// 组合实例:8 到 16 位、字母开头、只含字母数字下划线的用户名
const username = /^[a-zA-Z]\w{7,15}$/;
console.assert(username.test('alice_2026'));
console.assert(username.test('2026_alice') === false); // 数字开头不行
console.assert(username.test('ab') === false); // 太短
常见坑
- 搞错量词作用范围:/\d{4}-\d{2}/ 里的 {2} 只管紧邻的 \d,这通常正是你要的;但 /abc{2}/ 匹配 abcc 而不是 abcabc,想重复多个字符务必分组。
- 花括号里加空格:/\d{2, 4}/ 中的空格让整个 {2, 4} 在 JavaScript 里退化成字面字符,模式悄悄失效还不报错。
- 滥用 . 占位*:.* 能匹配一切也能匹配空串,/\d.*\d/ 遇到 1abc2 能匹配,遇到 12 也能匹配。能用更具体的字符类就别用 .。
- 忘记锚点导致「位数校验」形同虚设:/\d{4}/.test('12345') 是 true——它只要求含有连续 4 位数字。位数校验一定要配 ^$。
小结
-
- ? 和 {n} {n,} {n,m} 控制出现次数,量词只作用于左边一个元素,重复一段要用分组。下一节学习匹配「位置」而非字符的锚点。