js中正则表达式中【exec】用法深度解读

exec() 是 JavaScript 正则表达式对象(RegExp)中的一个方法,用于匹配字符串中的特定模式,并返回匹配结果。它比 test()match() 更强大,因为它不仅仅返回匹配成功与否,还返回匹配的具体内容及其相关信息。下面详细讲解 exec() 的相关知识点。

1. 基本语法

let regex = /模式/;
let result = regex.exec(字符串);

exec() 方法接受一个字符串作为参数,并返回一个数组,该数组表示匹配的结果。如果没有找到匹配,则返回 null

2. 返回值解释

exec() 找到匹配时,它返回一个数组,其中包含:

  • [0]:匹配到的整个字符串。
  • [1] 及其他:捕获组的内容(如果正则表达式使用了捕获组,如 ())。
  • index:匹配的开始位置(在原字符串中的起始索引)。
  • input:被搜索的原字符串。
  • groups:一个对象,包含所有命名捕获组的匹配内容(如果有使用命名捕获组)。
例子:
let regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
let result = regex.exec("2023-09-24");
console.log(result);

输出结果:

[
  '2023-09-24',   // 匹配到的整个字符串
  '2023',         // 第一个捕获组:年份
  '09',           // 第二个捕获组:月份
  '24',           // 第三个捕获组:日期
  index: 0,       // 匹配的起始索引
  input: '2023-09-24',  // 被搜索的字符串
  groups: {       // 命名捕获组
    year: '2023',
    month: '09',
    day: '24'
  }
]

在这个例子中,使用了命名捕获组(通过 (?<name>pattern) 语法),并且 exec() 的返回结果中 groups 属性包含了命名捕获组的匹配结果。

3. 捕获组 (Capturing Groups)

捕获组用 () 括起来,它可以匹配并提取部分字符串。你可以通过使用 exec() 来获取这些捕获的内容。命名捕获组可以为每个捕获的部分命名,方便后续使用。

捕获组例子:
let regex = /(\d+)\s(\w+)/;  // 匹配:数字 空格 字母组合
let result = regex.exec("123 abc");
console.log(result);

输出:

[
  '123 abc',  // 整个匹配的字符串
  '123',      // 捕获组 1:数字部分
  'abc',      // 捕获组 2:字母部分
  index: 0,   // 匹配开始的索引
  input: '123 abc'
]
命名捕获组例子:
let regex = /(?<number>\d+)\s(?<word>\w+)/;
let result = regex.exec("123 abc");
console.log(result.groups);

输出:

{
  number: '123',  // 捕获组 1:命名为 number
  word: 'abc'     // 捕获组 2:命名为 word
}

4. 全局标志 (Global Flag)

如果你在正则表达式中使用了全局标志(g),exec() 会在每次调用时继续从上次匹配结束的位置开始匹配。你需要多次调用 exec() 才能找到所有匹配。

示例:
let regex = /\d+/g;
let str = "123 456 789";
let result;

while ((result = regex.exec(str)) !== null) {
  console.log(result);
}

输出:

[ '123', index: 0, input: '123 456 789' ]
[ '456', index: 4, input: '123 456 789' ]
[ '789', index: 8, input: '123 456 789' ]

每次调用 exec(),它会返回下一个匹配的结果,直到返回 null,表示没有更多匹配。

5. lastIndex 属性

在全局匹配模式下,正则表达式对象的 lastIndex 属性会记录下次匹配开始的位置。每次匹配后,lastIndex 会更新,帮助 exec() 从上次结束的位置继续匹配。

示例:
let regex = /\d+/g;
let str = "123 456 789";
let result = regex.exec(str);

console.log(result);  // 匹配 123
console.log(regex.lastIndex);  // 输出 3

result = regex.exec(str);
console.log(result);  // 匹配 456
console.log(regex.lastIndex);  // 输出 7

6. 命名捕获组的优势

命名捕获组(使用 (?<name>pattern) 语法)可以让匹配结果更具可读性,特别是当你需要提取多个不同的部分时。

示例:
let regex = /(?<areaCode>\d{3})-(?<prefix>\d{3})-(?<lineNumber>\d{4})/;
let result = regex.exec("555-123-4567");
console.log(result.groups);

输出:

{
  areaCode: '555',
  prefix: '123',
  lineNumber: '4567'
}

通过 groups 属性,你可以更方便地获取并使用这些命名捕获的结果,而不需要依赖捕获组的顺序。

7. exec() 和其他方法的比较

  • test():返回布尔值,表示正则表达式是否匹配字符串。
  • match():如果是非全局正则表达式,它与 exec() 类似,但全局正则时,它一次性返回所有匹配项。
  • exec():可以返回详细的匹配结果,包括捕获组和匹配位置。
示例:
let regex = /\d+/g;
let str = "123 456 789";

// 使用 exec() 逐步匹配
let result;
while ((result = regex.exec(str)) !== null) {
  console.log(result[0]);  // 依次输出 123, 456, 789
}

// 使用 match() 一次性匹配
let matches = str.match(regex);
console.log(matches);  // ['123', '456', '789']

8. 常见错误

  • 忘记考虑全局标志和lastIndex:当使用全局正则时,exec() 会记住上次匹配结束的位置。如果不注意,可能导致跳过某些匹配。
  • 忽略捕获组:如果想提取特定内容但没有使用捕获组,匹配结果中就不会包含这些信息。
  • 没有处理命名捕获组:如果正则中使用了命名捕获组,但未正确访问 groups 属性,就无法获取命名捕获结果。

9. 总结

  • exec() 是非常灵活的正则表达式方法,适用于需要提取复杂匹配结果的场景。
  • 它不仅能返回匹配结果,还能提供匹配的索引和原字符串,且在全局模式下可以通过 lastIndex 实现连续匹配。
  • groups 属性为命名捕获组提供了直观的方式来访问匹配结果,使正则表达式的应用更加便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建javaWeb项目(详细版本)2021年2月

1、新建一个java项目 2、点击工程名称&#xff0c;找到add framework support&#xff0c;并点击 建好如图 3、分别在工程目录下创建resourse文件夹和web目录下创建classes和lib文件夹 建好如图 4、file找到 project structure 5、选中resourse 将其mark as sources 6、路径改…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

godot4.2入门项目 dodge_the_creep学习记录

前言 在学习博客Godot4 你的第一个2d游戏中的项目时&#xff0c;遇到了点小问题&#xff0c;记录一下。 官方项目 传送门 问题 怪兽直接从屏幕中间部分冒出来&#xff0c;以及角色出现时位于屏幕外角色被设置的背景图遮挡 解决方法 1.节点的位置没有对齐&#xff0c;正确示例…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统&#xff0c;它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度&#xff0c;你只需要提供你需要监控的数据&#xff0c;它就可以帮你生成各种可视化仪表。同时它…

Vue-Bag-Admin 采用漂亮的 Naive UI 构建的开源中后台系统,基于 Vue3 / Vite / TypeScript 等最新的前端技术栈

这是一款完成度很高、实用性很强的 admin 前端框架&#xff0c;颜值不错&#xff0c;推荐给大家。 Vue-Bag-Admin 在官网上也直接称为 Bag-Admin&#xff0c;这是一款专门为企业项目搭建中后台管理平台的前端框架&#xff0c;基于目前最新的前端技术栈 Vue3、Vite、TypeScript…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务&#xff0c;它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同&#xff0c;后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…

微调大模型(Finetuning Large Language Models)—Evaluation(六)

1. 微调后对模型进行评估 模型的评估目前没有统一的标准&#xff0c;有从正向角度&#xff0c;核对是否命中&#xff0c;当然也有从反向角度&#xff0c;考虑未命中的错误分析。 常见的评估方式如图所示&#xff1a; 本节学习资料地址&#xff1a;传送门 2. 代码测试 2.1 …

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

XSS闯关小游戏(前13关)

挖掘思路 1.存在可控参数 2.页面存在回显 3.使用带有特殊字符的语句去测试&#xff0c;网站是否进行了实例化 ( 例如 ">123 ) 4.构造闭合&#xff0c;实现payload的逃逸 1 name处参数可控&#xff0c;直接打即可 2 这里知道<>被实体编码了 再测试">1…

想做个WPS的自动化代码,参考如下:

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

大碗娱乐发布业务调整说明 取消艺人经纪业务

大碗娱乐今日发布业务调整说明&#xff1a;不再负责艺人业务&#xff0c;而贾玲导演将专注内容创作。据悉&#xff0c;其公司旗下艺人张小斐、许君聪、卜钰、何欢、张泰维、朱天福、曹贺军、刘宏禄的经纪合约均已到期&#xff0c;双方不再续约&#xff0c;但未来会共同寻求以其…

【HTML5】html5开篇基础(3)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

[大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作

​​​​​​Generation of Complex 3D Human Motion by Temporal and Spatial Composition of Diffusion Models L Mandelli, S Berretti - arXiv preprint arXiv:2409.11920, 2024 通过时间和空间组合扩散模型生成复杂的3D人物动作 摘要 本文提出了一种新的方法&#xff0…

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…