JavaScript中如何提取匹配的子串
在JavaScript开发中,我们经常需要从字符串里提取符合特定规则的子串,比如从一段文本中找出所有的手机号、邮箱,或者提取指定格式的内容。实现这个功能的核心依赖字符串的match方法、正则表达式的exec方法,以及带捕获组的正则表达式,下面我们逐一讲解具体的使用方式。
使用字符串的match方法提取子串
字符串的match方法是最常用的提取方式,它接收一个正则表达式作为参数,返回匹配到的子串数组。如果正则表达式没有设置全局匹配标志g,那么只会返回第一个匹配的结果和对应的捕获组内容;如果设置了g,则会返回所有匹配到的子串,但不会包含捕获组的内容。
下面这个例子演示了不使用全局匹配时,提取字符串中第一个手机号以及手机号里的区号部分:
// 定义待匹配的字符串
const text = '我的联系方式是13800138000,备用号是13900139000,区号010';
// 定义带捕获组的正则,第一个捕获组匹配区号,第二个匹配手机号主体
const reg = /(\d{3,4})\d{7,8}/;
// 调用match方法提取匹配内容
const result = text.match(reg);
console.log(result);
// 输出结果:["13800138000", "1380", index: 7, input: "我的联系方式是13800138000,备用号是13900139000,区号010", groups: undefined]
// result[0]是完整匹配的子串,result[1]是第一个捕获组匹配的内容
console.log('完整手机号:', result[0]); // 完整手机号: 13800138000
console.log('手机号前4位:', result[1]); // 手机号前4位: 1380如果我们需要提取字符串中所有的手机号,只需要在正则后面加上g标志:
const text = '我的联系方式是13800138000,备用号是13900139000,区号010';
// 加上g标志,匹配所有符合规则的子串
const reg = /(\d{3,4})\d{7,8}/g;
const result = text.match(reg);
console.log(result); // 输出:["13800138000", "13900139000"]
// 注意:使用g标志时,match返回的数组只包含完整匹配的子串,不包含捕获组内容使用正则表达式的exec方法提取子串
当需要同时获取所有匹配的子串和对应的捕获组内容时,match方法配合g标志就无法满足需求了,这时候可以使用正则表达式的exec方法。exec方法会返回当前匹配的结果,包含完整匹配内容和捕获组,每次调用会匹配下一个符合规则的内容,直到返回null表示匹配结束。
以下示例演示了用exec提取所有手机号以及对应的前4位:
const text = '我的联系方式是13800138000,备用号是13900139000,区号010';
// 定义带捕获组和g标志的正则
const reg = /(\d{3,4})\d{7,8}/g;
let result;
// 循环调用exec,直到返回null
while ((result = reg.exec(text)) !== null) {
console.log('完整手机号:', result[0], '前4位:', result[1]);
}
// 输出:
// 完整手机号: 13800138000 前4位: 1380
// 完整手机号: 13900139000 前4位: 1390使用字符串的matchAll方法提取子串
ES2020引入了matchAll方法,它可以更方便地获取所有匹配结果和对应的捕获组内容,返回的是一个迭代器,我们可以用扩展运算符或者for...of循环来遍历结果,不需要像exec那样手动循环。
下面的例子用matchAll实现和上面exec相同的效果:
const text = '我的联系方式是13800138000,备用号是13900139000,区号010';
const reg = /(\d{3,4})\d{7,8}/g;
// 调用matchAll获取迭代器,用扩展运算符转为数组
const results = [...text.matchAll(reg)];
results.forEach(item => {
console.log('完整手机号:', item[0], '前4位:', item[1]);
});
// 输出:
// 完整手机号: 13800138000 前4位: 1380
// 完整手机号: 13900139000 前4位: 1390不同方式的适用场景总结
我们可以根据实际需求选择合适的提取方式,以下是不同场景的对应选择:
- 只需要提取第一个匹配的子串和捕获组:使用字符串的
match方法,正则不加g标志 - 只需要提取所有匹配的子串,不需要捕获组:使用字符串的
match方法,正则加g标志 - 需要提取所有匹配的子串和对应的捕获组,且运行环境支持ES2020及以上:优先使用
matchAll方法,代码更简洁 - 需要提取所有匹配的子串和对应的捕获组,运行环境不支持
matchAll:使用正则的exec方法循环匹配
需要注意的是,使用正则表达式提取子串时,正则的编写是关键,要准确描述需要匹配的子串规则,避免出现漏匹配或者误匹配的情况。如果匹配的规则比较复杂,可以先在正则测试工具中验证正则的正确性,再应用到代码里。
JavaScript提取子串match方法exec方法matchAll方法 本作品最后修改时间:2026-05-23 23:00:39