控制台里跑 'abc123'.match(/[0-9]+/),返回的数组第一个元素是 123,还带着 index 和 input。把正则加上 g 再跑一次,结果只剩 ['123'],很多人第一次见都会愣一下。
不加 g,返回的是匹配详情
js match 不带 g 时,返回一个类数组:第 0 项是匹配到的内容,后面是捕获组,另外还有 index 和 input 两个属性。适合只取第一处匹配,或者要拿分组。
const str = 'order-2024-07-15'; const m = str.match(/([0-9]{4})-([0-9]{2})-([0-9]{2})/); console.log(m[0]); // 2024-07-15 console.log(m[1]); // 2024 console.log(m.index); // 6上面这段不需要 g,分组和位置都拿得到。如果加上 g,m 会变成纯字符串数组,m[1] 不再是月份,index 也没有了,这是最常见的坑。
加了 g,只返回所有匹配内容
带 g 时返回全部匹配,但只有字符串,没有下标和分组。比如 'a1b22c333'.match(/[0-9]+/g) 得到 ['1', '22', '333']。想边遍历边拿分组,用 matchAll。
const text = 'a1b22c333'; console.log(text.match(/[0-9]+/g)); // ['1','22','333'] const all = [...text.matchAll(/([a-z])([0-9]+)/g)]; console.log(all[0][1]); // amatchAll 的正则必须带 g,否则直接抛 TypeError。它返回的是迭代器,不能直接 map,要先展开成数组或者用 for...of。老浏览器不支持的话,只能退回 exec 循环。
没匹配到返回 null
'abc'.match(/[0-9]+/) 返回 null,不是空数组。直接取 m[0] 就会报 Cannot read properties of null。先判断 if (m) 再用,或者写 m?.[0],别偷懒。
只判断有没有匹配,用 test 更直接,正则要不要加 g 都不影响结果。要位置和分组用 match 不带 g,要全部匹配用 match 带 g 或 matchAll。js match 怎么用,取决于你想从结果里拿什么。