导读:本期聚焦于小伙伴创作的《JavaScript中如何提取匹配的子串?match、exec与matchAll方法详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript中如何提取匹配的子串?match、exec与matchAll方法详解》有用,将其分享出去将是对创作者最好的鼓励。

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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。