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

news/2024/9/27 22:17:37 标签: javascript, 正则表达式, 开发语言, web, 前端
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

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

1. 基本语法

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

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

2. 返回值解释

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

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

输出结果:

javascript">[
  '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() 来获取这些捕获的内容。命名捕获组可以为每个捕获的部分命名,方便后续使用。

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

输出:

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

输出:

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

4. 全局标志 (Global Flag)

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

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

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

输出:

javascript">[ '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() 从上次结束的位置继续匹配。

示例:
javascript">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) 语法)可以让匹配结果更具可读性,特别是当你需要提取多个不同的部分时。

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

输出:

javascript">{
  areaCode: '555',
  prefix: '123',
  lineNumber: '4567'
}

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

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

  • test():返回布尔值,表示正则表达式是否匹配字符串。
  • match():如果是非全局正则表达式,它与 exec() 类似,但全局正则时,它一次性返回所有匹配项。
  • exec():可以返回详细的匹配结果,包括捕获组和匹配位置。
示例:
javascript">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.niftyadmin.cn/n/5679681.html

相关文章

Linux(ubuntu)Makefile

一、Makefile简介 Makefile的必要性:嵌入式开发要将Linux移植到开发版上&#xff0c;而开发版没有图形界面。只能用终端&#xff0c;我们可以用gcc&#xff0c;但是很不方便。而Makefile能解决这个问题。 二、Makefile下载 终端输入:sudo apt install -y build-essential 三…

Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.

一运行就循环打印这个报错&#xff0c; 解决办法&#xff0c;每次改参数之后在HIerarchy中手动保存&#xff0c;就会停止循环打印&#xff0c;style中的字体也显示出来了&#xff0c; 或者 直接换个低版本的

excel数据常用函数学习记录

1、VLOOKUP查询函数&#xff0c;匹配数据返回 vlookup(查找值,查找范围,要查找的值在第几列,0表示精确查找) enter键返回 例如&#xff1a;在E列中返回&#xff0c;A列的值与D列一致的对应的B值。只会返回查找到的第一个 如果需要把查找到的匹配的数据都返回到单元格中&…

SpringCloud源码:客户端分析(二)- 客户端源码分析

背景 我们继续分析EurekaClient的两个自动化配置类&#xff1a; 自动化配置类功能职责EurekaClientAutoConfiguration配置EurekaClient确保了Eureka客户端能够正确地&#xff1a;- 注册到Eureka服务端- 周期性地发送心跳信息来更新服务租约- 下线时通知Eureka服务端- 获取服务实…

D14【python接口自动化学习】-python基础之内置数据类型

day14 字典的定义 学习日期&#xff1a;20240921 学习目标&#xff1a;内置数据类型--23 字典&#xff1a;如何处理映射类型的数据&#xff1f; 学习笔记&#xff1a; 映射与字典 字典的定义 字典的删除 练习 # 将以下两个列表转换成字典 list_name[name1,name2,name3] li…

Vulhub TheEther_1.0.1靶机详解

项目地址 https://download.vulnhub.com/theether/theEther_1.0.1.zip实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知theEthe…

基于springboot+vue医院挂号就诊系统设计与实现

基于springbootvue医院挂号就诊系统设计与实现 springboot180基于spring boot的医院挂号就诊系统 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费…

RabbitMQ的高级特性-消息确认机制

对于RabbitMQ发送消息到消费端的可靠性保障 引入&#xff1a;发送者发送消息后&#xff0c;到达消费端之后会出现一下两种情况&#xff1a; ①消息处理成功 ②消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第两种情况, 就会造成消息丢失&#xff0…