JS中正则表达式捕获组与反向引用详解

正则表达式(Regular Expression,简称 Regex)是一种强大的字符串匹配工具,它能够让我们通过模式来查找、匹配、替换字符串中的内容。而在正则表达式中,捕获组是一个非常重要的概念,常常用于将匹配到的内容保存下来供后续操作。今天我们就来详细讲解 JavaScript 中的捕获组、反向引用、以及替换操作中的 $1$2 等符号。

1. 什么是捕获组(Capture Group)

捕获组的定义

捕获组 是指通过用小括号 () 将正则表达式中的一部分包裹起来,从而将这部分内容单独保存下来。捕获组不仅可以用来对模式进行分组,还可以将匹配到的内容保存,方便后续的引用和替换。

捕获组的作用:
  • 分组:用括号将模式的一部分分组,使其在逻辑上能够被看作一个整体。
  • 捕获匹配的内容:括号中的内容匹配成功后会被捕获,并可以通过编号(从 1 开始)来引用。
  • 后续引用:捕获的内容可以在正则表达式或替换操作中重新使用。

2. 如何创建捕获组

在 JavaScript 中,创建捕获组非常简单,只需要将正则表达式的一部分用括号 () 包裹起来即可。

示例 1:简单的捕获组
const regex = /(hello) (world)/;
const str = "hello world";
const result = regex.exec(str);
console.log(result);
// 输出: ["hello world", "hello", "world"]
  • "(hello)" 是第一个捕获组,匹配到的是 "hello"
  • "(world)" 是第二个捕获组,匹配到的是 "world"
  • result[0] 保存的是整个匹配的字符串 "hello world",而 result[1]result[2] 分别保存的是第一个和第二个捕获组的匹配结果。

3. 反向引用(Backreference)

反向引用的概念

反向引用是指在同一个正则表达式中,引用之前定义的捕获组匹配的内容。通过 \1\2 等符号可以引用之前捕获组中的内容。

  • \1 代表第一个捕获组的内容。
  • \2 代表第二个捕获组的内容,以此类推。
示例 2:反向引用
const regex = /(\d{3})-(\d{3})-\1/;
const str1 = "123-456-123";
const str2 = "123-456-789";console.log(regex.test(str1)); // 输出 true
console.log(regex.test(str2)); // 输出 false

在这个例子中:

  • (\d{3}) 是一个捕获组,它匹配三个连续的数字。
  • \1 引用第一个捕获组,也就是说,第三组数字必须和第一个组匹配的内容相同。
  • str1 中第三组数字是 "123",与第一个组匹配的 "123" 相同,因此返回 true
  • 而在 str2 中,第三组是 "789",与第一个组不相同,因此返回 false

4. 替换操作中的 $1$2

在正则表达式的替换操作中,捕获组同样起到了非常重要的作用。JavaScript 提供了 replace() 方法来进行字符串替换,并允许我们使用 $1$2 等符号来引用捕获组的内容。

  • $1 引用第一个捕获组匹配到的内容。
  • $2 引用第二个捕获组匹配到的内容,以此类推。
示例 3:使用捕获组进行替换
const str = "John Smith";
const regex = /(\w+)\s(\w+)/;
const newStr = str.replace(regex, "$2, $1");console.log(newStr); 
// 输出: "Smith, John"

在这个例子中:

  • (\w+) 是第一个捕获组,匹配名字 "John"
  • (\w+) 是第二个捕获组,匹配姓氏 "Smith"
  • "$2, $1"replace() 中表示将第二个捕获组的内容放在前面,第一个捕获组的内容放在后面。因此,名字和姓氏的顺序被互换,输出结果为 "Smith, John"

5. $ 符号的其他用法

除了在替换操作中用作捕获组的引用,$ 在正则表达式中还有其他特殊用途。最常见的是用于匹配字符串的结尾。

示例 4:匹配字符串结尾
const regex = /world$/;
const str1 = "hello world";
const str2 = "hello worlds";console.log(regex.test(str1)); // 输出 true
console.log(regex.test(str2)); // 输出 false
  • world$ 表示匹配以 "world" 结尾的字符串。
  • 字符串 "hello world""world" 结尾,因此匹配成功,返回 true
  • 字符串 "hello worlds""worlds" 结尾,不符合模式,返回 false

6. 进阶:非捕获组(Non-Capturing Group)

在有些情况下,我们可能只想对某些部分进行分组,而不希望捕获这些内容。为了实现这一点,JavaScript 支持非捕获组。非捕获组的语法是 (?:...)

示例 5:非捕获组
const regex = /(?:hello) world/;
const str = "hello world";
const result = regex.exec(str);
console.log(result);
// 输出: ["hello world"]
  • (?:hello) 是一个非捕获组,虽然它会匹配 "hello",但不会保存这个匹配结果。
  • 这样做的好处是,当我们不需要反向引用时,可以减少不必要的捕获组,从而优化正则表达式的性能。

总结

捕获组、反向引用、以及替换操作中的 $1$2 是正则表达式中的重要工具,它们极大地提高了我们处理字符串的灵活性和效率。掌握这些知识后,我们可以:

  • 创建捕获组:使用 () 将正则表达式中的部分分组并捕获内容。
  • 使用反向引用:通过 \1\2 等符号引用之前捕获的内容。
  • 替换操作:使用 $1$2replace() 中引用捕获组进行复杂的字符串替换。
  • 灵活应用:学会在适当场合使用非捕获组来优化性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零信任赋予安全牙齿,AI促使它更锋利

距离上次写关于安全的文字已经过去了很久很久,久到上次看到的AI还停留在TTS、ASR等最初的语音交互搜索类似的各种智能音箱以及通过关键字匹配的基于知识库的聊天的机器人。之后的几年各种视觉识别遍地开花,AI四小龙在人脸识别上成熟应用,再然…

浏览器百科:网页存储篇-如何在Chrome打开localStorage窗格(五)

1.引言 在前面的章节中,我们详细介绍了 localStorage 的基本概念、特性及其常用方法,帮助开发者在网页应用中实现数据的持久化存储。为了更好地管理和调试这些存储的数据,了解如何打开和使用浏览器的 localStorage 窗格是非常重要的。本篇文…

科研绘图系列:R语言差异基因四分图(Quad plot)

介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常: 第一个子图显示变量A和B的关系。第二个子图显示…

海外云服务器安装 MariaDB10.6.X (Ubuntu 18.04 记录篇二)

本文首发于 秋码记录 MariaDB 的由来(历史) 谈起新秀MariaDB,或许很多人都会感到陌生吧,但若聊起享誉开源界、业界知名的关系型数据库——Mysql,想必混迹于互联网的人们(coder)无不知晓。 其…

信捷 XD PLC 位软元件

位软元件的种类相对简单,一般为常见的 X、Y、M、HM、S、HS、T、HT、C、HC, 除此之外, 还可由寄存器中的某一位来表示。 1)继电器 ⚫ 输入继电器 X,八进制表示法。 ⚫ 输出继电器 Y,八进制表示法。 ⚫ …

SQL语言的规则和规范

规则 是什么呢,规则就是我们最基本,每时每刻都要遵守的比如人行道靠右,不能逆行, 规范 呢就是锦上添花,如果你不这么做,是不那么道德,不那么好的,就像小学生见到老师要问好&#…

C++11(1)

目录 前言 小故事 C11优势 统一的列表初始化 1.{}初始化 2. std::initializer_list 声明 1.auto 2.decltype 3.nullptr 前言 小故事 1998 年是 C 标准委员会成立的第一年,本来计划以后每 5 年视实际需要更新一次标准, C 国际 标准委员会在研究…

Axure制作圆球在区域范围内移动效果的案例

在Axure RP中,我们可以通过设置多个交互动作和动态面板来创建复杂的动画效果,比如实现一个圆球在指定区域内通过八个方向按钮控制移动的效果。以下是一个详细的步骤介绍,帮助你理解并制作这一效果。 预览: https://1zvcwx.axshare…

简述CCS平面线性光源

光源在机器视觉系统中起着重要作用,不同环境、场景及应用合适光源都不一样,今天我们来看看LFX3-PT系列平面线性光源。它是最适合检测镜面物体的凹凸,外壳小巧的光源。备有根据检测条件可选的2种线间距。1mm型(型号末尾:A&#xff…

idea一键自动化部署项目

文章目录 前言一、 IDEA插件安装1. 首先下载 Alibaba Cloud Toolkit 插件2. 插件下载完成后重启IDEA 二、SpringBoot项目准备1. pom.xml 文件2. controller3. 启动类 三、SpringBoot项目jar包部署1. Alibaba Cloud Toolkit 插件服务器配置2. 主机 IP、用户名、密码 点击测试链接…

日志系统(最新版)

基础知识 日志,由服务器自动创建,并记录运行状态,错误信息,访问数据的文件。 同步日志,日志写入函数与工作线程串行执行,由于涉及到I/O操作,当单条日志比较大的时候,同步模式会阻塞…

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑: 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文…

【Anaconda】修改jupyter notebook默认打开的工作目录、jupyter notebook快捷键

jupyter notebook快捷键 针对单元格的颜色蓝色命令行模式绿色编辑模式 两种模式的切换编辑模式切换到命令行模式 >>> esc键命令行模式切换到编辑模式 >>> 鼠标左键或者直接按enter键1.标题的书写方式1:1.esc进入命令行模式2.按m键3.写内容4.运行单元格即可方…

SprinBoot+Vue健康管管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

LabVIEW水泵机组监控系统

介绍了一种基于LabVIEW的水泵机组智能监控系统。该系统结合先进的传感器和数据采集技术,实时监控水泵机组的运行状态,有效预防故障,提高运行效率。通过LabVIEW平台的集成开发环境,系统实现了高效的数据处理和友好的用户界面。 项…

SpringCloud-02 Consul服务注册与发现

Consul是一种用于服务发现、配置和分布式协调的开源工具。Consul提供了以下主要功能: 1.服务发现:Consul允许开发人员在微服务架构中注册和发现服务。它可以自动检测新添加的服务并为它们分配唯一的网络地址。 2.健康检查:Consul可以定期检查…

一篇文档教会你从JavaScript语法走进DOM,让你的网页动起来

目录 JavaScript与WebAPI WebAPI简介 DOM 获取元素 事件 事件三要素 常见的事件类型 获取修改元素属性 基本介绍和使用 案例1:实现文本框内数字计数 案例2:实现“全部选中”按钮触发时相应的效果(worth trying for a freshman&…

turbovnc 服务端、客户端安装

turbovnc 可以方便地远程登录带界面的linux系统,比如xbuntu、kali等;远程windows11系统,经过亲身测试体验,感觉还是不如windows自带的rdp服务(mstsc命令连接)好用。 一、安装客户端 下载最新版本的客户端…

力扣面试经典算法150题:接雨水

接雨水 今天的题目是力扣面试经典算法150题中的困难难度数组题目:分发糖果。 题目链接:https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定 n 个非负整数表示每个宽度为…

0904作业+思维导图

一、作业 &#xff08;将昨天的作业修改为标准模板类的&#xff09; 1、代码 #include <iostream> #include <stack> using namespace std; //队列模板类 template<typename T> class Queue { private:int max; //队列最大容量int num; //队列内…