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:命名为 numberword: '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); // 输出 3result = 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属性为命名捕获组提供了直观的方式来访问匹配结果,使正则表达式的应用更加便捷。
相关文章:
js中正则表达式中【exec】用法深度解读
exec() 是 JavaScript 正则表达式对象(RegExp)中的一个方法,用于匹配字符串中的特定模式,并返回匹配结果。它比 test() 和 match() 更强大,因为它不仅仅返回匹配成功与否,还返回匹配的具体内容及其相关信息…...
Dockerfile的详解与案例
《Dockerfile 详解与案例》 一、Dockerfile 简介 Dockerfile 是一个用来构建 Docker 镜像的文本文件,它包含了一系列指令,用于描述如何创建一个 Docker 镜像。通过 Dockerfile,你可以定义镜像的基础环境、安装软件包、设置环境变量等操作&a…...
[spring]用MyBatis XML操作数据库 其他查询操作 数据库连接池 mysql企业开发规范
文章目录 一. MyBatis XML配置文件1. 配置链接字符串和MyBatis2. 写持久层代码方法定义Interface方法实现xml测试 3. 增删改查增:删改查 二. 开发规范(mysql)三. 其他查询操作1. 多表查询2. #{} 和 ${}(面试题)使用区别 排序功能like查询 三. 数据库连接池 一. MyBatis XML配置…...
[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?
目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …...
【有啥问啥】 Self-Play技术:强化学习中的自我进化之道
Self-Play技术:强化学习中的自我进化之道 在人工智能的快速发展中,强化学习(Reinforcement Learning, RL)已成为推动智能体自主学习与优化的关键力量。Self-Play技术,作为强化学习领域的一项前沿创新,通过…...
LCR 008. 长度最小的子数组
文章目录 1.题目2.思路3.代码 1.题目 LCR 008. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件…...
uniApp 解决uniapp三方地图获取位置接口的请求次数限制问题,分别提供 Android 和 iOS 的实现方法(原生插件获取)
以下是使用 UniApp 编写获取位置信息的原生插件步骤,这里分别提供 Android 和 iOS 的实现方法。 一、Android 端实现 创建原生插件模块 在 UniApp 项目目录下创建一个目录,比如 nativeplugins/android/locationPlugin。使用 Android Studio 创建一个 An…...
Zabbix Agent 监控 MySQL 进程状态
1. 使用 Zabbix Agent 监控 MySQL 进程状态 这是最简单的方式,通过 Zabbix Agent 监控 MySQL 进程是否在运行。具体步骤如下: 步骤1: 确认 MySQL 进程的名称 在你的 CentOS 服务器上,运行以下命令来确认 MySQL 进程的名称: ps aux | grep mysql通常,MySQL 服务的进程名…...
【模型】感知器
感知器是最早的人工神经网络之一,也是现代深度学习的基础之一。 1. 感知器(Perceptron) 1.1 定义与功能 感知器是一种线性二分类模型,旨在模拟生物神经元的基本功能。它通过对输入特征进行加权求和,并应用激活函数来…...
HtmlCss 基础总结(基础好了才是最能打的)五
Html&Css 基础学习回顾总结 Html&Css 基础总结(基础好了才是最能打的)一 Html&Css 基础总结(基础好了才是最能打的)二 Html&Css 基础总结(基础好了才是最能打的)三 Html&Css 基础总结…...
图神经网络实战——分层自注意力网络
图神经网络实战——分层自注意力网络 0. 前言1. 分层自注意力网络1.1 模型架构1.2 节点级注意力1.3 语义级注意力1.4 预测模块 2. 构建分层自注意力网络相关链接 0. 前言 在异构图数据集上,异构图注意力网络的测试准确率为 78.39%,比之同构版本有了较大…...
基于深度学习的数字识别系统的设计与实现(python、yolov、PyQt5)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
ChatGPT 提取文档内容,高效制作PPT、论文
随着人工智能生成内容(AIGC)的快速发展,利用先进的技术工具如 ChatGPT 的 RAG(Retrieval-Augmented Generation,检索增强生成)模式,可以显著提升文档内容提取和内容创作的效率。以下将详细介绍如…...
3、等保1.0 与 2.0 的区别
数据来源:3.等保1.0和2.0的区别_哔哩哔哩_bilibili 等保1.0时代VS等保2.0时代五个规定动作:定级、备案、建设整改、等级测评、监督检查工作内容维持5个规定动作,增加风险评估、安全监测、通报预警、事件调查、数据防护自主可控、供应链安全、…...
Angular面试题九
一、在Angular中,你如何管理全局状态或跨组件共享数据?有哪些常见的实现方式? 在Angular中,管理全局状态或跨组件共享数据是应用开发中的一个重要方面。这有助于保持数据的一致性和可维护性,特别是在复杂的应用中。以下…...
(转载)智能指针shared_ptr从C++11到C++20
shared_ptr和动态数组 - apocelipes - 博客园 (cnblogs.com) template<typename T> std::shared_ptr<T> make_shared_array(size_t size) { return std::shared_ptr<T>(new T[size],std::default_delete<T[]>()); } std::shar…...
Ubuntu 上安装 Miniconda
一、下载 Miniconda 打开终端。访问 Anaconda 官方仓库下载页面https://repo.anaconda.com/miniconda/选择Miniconda3-py310_24.7.1-0-Linux-x86_64.sh,进行下载。文件名当中的py310_24.7.1表示,在 conda 的默认的 base 环境中的 Python 版本是3.10&…...
【Vue系列五】—Vue学习历程的知识分享!
前言 本篇文章讲述前端工程化从模块化到如今的脚手架的发展,以及Webpack、Vue脚手架的详解! 一、模块化 模块化就是把单独的功能封装到模块(文件)中,模块之间相互隔离,但可以通过特定的接口公开内部成员…...
CaLM 因果推理评测体系:如何让大模型更贴近人类认知水平?
CaLM 是什么 CaLM(Causal Evaluation of Language Models,以下简称“CaLM”)是上海人工智能实验室联合同济大学、上海交通大学、北京大学及商汤科技发布首个大模型因果推理开放评测体系及开放平台。首次从因果推理角度提出评估框架ÿ…...
深入探索卷积神经网络(CNN)
深入探索卷积神经网络(CNN) 前言图像的数字表示灰度图像RGB图像 卷积神经网络(CNN)的架构基本组件卷积操作填充(Padding)步幅(Strides) 多通道图像的卷积池化层全连接层 CNN与全连接…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
