JS宏进阶:正则表达式的使用

正则表达式,对于任何一门编程语言来说,都是一种非常强大的工具,主要用于搜索、编辑或操作文本和数据。因此,在JS中,也存在相应的对象new RegExp( ),在本章中,将详细介绍正则表达式在JS宏中的运用。

一、正则表达式的创建

在基础篇章中,曾提及正则表达式对象,在JS中有两种创建方法,示例如下:

// 字面量语法

const regex1 = /abc/;

// RegExp 构造函数

const regex2 = new RegExp('abc');

此外,在js中创建正则表达式时,还存在响应的修饰符。如下所示:

符号含义
i忽略大小写(ignoreCase)。
g全局搜索(global)。
m多行匹配(multiline)。
uUnicode 模式(Unicode),ES6 新增,用于正确处理 Unicode 字符。
y粘连模式(sticky),ES6 新增,确保匹配从目标字符串的当前位置开始。
sdotAll 模式,ES2018 新增,使 . 匹配包括换行符在内的所有字符。

因此,在JS中,正则表达式的完整创建语法为:

字面量创建语法:let reg = /正则匹配模式/修饰符号,示例如下

const regexp = /[0-9]+/g  //全局搜索

构造函数创建语法:let reg = new RegExp("正则匹配模式", "修饰符"),示例如下

let reg = new RegExp("[0-9]+", "g") //全局搜索

注意:对于两种创建方法来说,修饰符都是可选的。另外,如果使用new RegExp构造函数来创建正则表达式对象,要匹配 \ 本身,要写成:\\\\,这是因为,他的参数是字符串,在字符串中 \ 是需要转义的,所以,前面两个 \\ 相当于正则表达式中的元字符 \ , 后面的两个 \\ 相当于被元字符 \ 转义的 \ ,连在一起就表示匹配 \ 本身。依次类推:元字符 \d ,需写成 \\d ; \w ,需写成 \\w 等。

二、正则表达式对象中的方法

1、test方法

用于测试一个字符串是否匹配某个模式,返回布尔值。

const regex = new RegExp("hello");
console.log(regex.test("hello world")); // true
console.log(regex.test("world")); // false

上述示例中,用于测试的字符串"hello world"中符合正则匹配模式:hello,返回true。不符合的,就返回false。

2、exec方法

用于在字符串中执行搜索匹配。匹配成功返回一个数组,否则返回 null 。返回的数组包含匹配的结果以及捕获组(如果有的话)。

const regex = new RegExp("(hello) (world)");
const result = regex.exec("hello world");
if (result) {console.log(result[0]); // "hello world"console.log(result[1]); // "hello"console.log(result[2]); // "world"
}

另外,返回的数组包含一些额外的属性,如下图所示:

三、字符串对象String中的正则表达式

在基础篇章中,我们已经了解了字符串对象中的一些常用方法。比如,用于查找某一特定字符索引的serch,字符串替换的replace等等。在这些方法中,我们也可以将正则表达式作为他的参数,这样就可以查找、替换、匹配符合某一特定模式的字符串。

1、字符串方法match

使用正则表达式模式在字符串中查找匹配项。语法如下:

str.match(regexp);

str:是要搜索的字符串对象

regexp:是正则表达式对象

返回值与注意点如下所示:

如果 regexp 没有全局标志 g,则返回一个数组,包含第一个匹配项及其捕获组(如果有的话),以及两个附加属性:index(匹配项在字符串中的位置)和input (被搜索的字符串)。

如果 regexp 有全局标志 g,则返回一个包含所有匹配项的数组,没有捕获组信息。

如果没有匹配项,则返回 null 。

使用实例

const str = "abs12ysjhi892jha98wehj29ashx982y3huiahs89829hiuas8d9902hsd8a9";// 查找第一个匹配项
const match1 = str.match(/\d+/);
console.log(JSON.stringify(match1)); // ["12"]// 查找所有匹配项
const match2 = str.match(/\d+/g); //使用全局搜索,查找所有匹配项
console.log(JSON.stringify(match2)); // ["12","892","98","29","982","3","89829","8","9902","8","9"]

执行效果如下图所示

2、字符串方法matchAll

返回一个包含所有匹配正则表达式及其分组捕获的迭代器。语法如下:

str.matchAll(regexp);

str:是要搜索的字符串对象

regexp:是正则表达式对象

返回值是一个迭代器,每个迭代项是一个包含匹配项及其捕获组的数组。

使用实例:

const str = "test1test2";
const regex = /t(e)(st(\d?))/g;const matches = str.matchAll(regex);
for (const match of matches) {console.log(match.join(",") + " index: " + match.index + " input:" + match.input + " " + typeof match.groups);
}// 输出:
// ["test1", "e", "st1", "1", index: 0, input: "test1test2", groups: undefined]
// ["test2", "e", "st2", "2", index: 5, input: "test1test2", groups: undefined]

执行效果图如下所示:

3、字符串方法replace

使用正则表达式模式在字符串中查找匹配项,并替换与此模式匹配的子串。语法如下

str.replace(regexp|substr, newSubStr|function);

str:是要搜索的字符串对象

regexp|substr:是正则表达式对象 | 等待替换的字符串

newSubStr|function:用于替换匹配项的新字符串 | 一个返回替换字符串的函数

返回一个新字符串,其中匹配项被替换为新的字符串或函数返回值。

使用实例如下所示:

const str = "Hello World!";// 替换匹配项
const newStr1 = str.replace(/world/i, "JavaScript");
console.log(newStr1); // "Hello JavaScript!"// 使用函数进行替换
const newStr2 = str.replace(/(\w+)\s(\w+)/, (match, p1, p2) => {return `${p2}, ${p1}!`;
});
console.log(newStr2); // "World, Hello!"

效果图如下所示:

4、字符串方法search

执行正则表达式和字符串之间的搜索匹配,返回匹配项的索引,或者如果没有匹配项,则返回 -1。语法如下

str.search(regexp);

str:是要搜索的字符串对象

regexp:是正则表达式对象

使用实例:

const str = "Hello World!";// 查找匹配项的索引
const index = str.search(/world/i);
console.log(index); // 6

5、字符串方法split

使用正则表达式模式在字符串中查找匹配项,并分割字符串。语法如下

str.split(regexp|substr, limit);

str:是要搜索的字符串对象

regexp|substr:要分割的子串(非正则表达式模式)

limit ( 可选 ):一个整数,限制返回的数组长度。

返回值是一个数组,包含被分割后的子串。

使用实例:

const str = "Hello World,   Hello   JavaScript";// 使用正则表达式分割字符串
const parts = str.split(/\s+/);
console.log(JSON.stringify(parts)); // ["Hello","World,","Hello","JavaScript"]// 限制返回数组的长度
const parts2 = str.split(/\s+/, 2);
console.log(JSON.stringify(parts2)); // ["Hello","World,"]

效果图如下所示:

四、总结

new RegExp( ) 提供了一种动态创建正则表达式的方法,而正则表达式对象的方法(如 test和 exec)以及字符串对象的方法(如 match、replace等)则提供了丰富的操作手段来处理和匹配字符串。理解这些方法和标志,可以大大提高你在 JavaScript 中处理字符串的效率和能力。

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

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

相关文章

在 Kubernetes 上快速安装 KubeSphere v4.1.2

目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 (1)时钟 (2)RTC (3)ADC1 &#xf…

JavaScript学习笔记(1)

html 完成了架子, css 做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习 JavaScript,这门语言会让我们的页面能够和用户进行交互。 一、引入方式 1.内部脚本 将 JS 代码定义在 HTML 页面中 Jav…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址:https://www.gaga.gallery 标题:Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源:加利福…

Day 14 卡玛笔记

这是基于代码随想录的每日打卡 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:r…

|Python新手小白中级教程|第三十章:日期与时间(入门)

文章目录 前言一、日期与时间的基本概念二、时间戳1.概念2.形成过程 三、Python的时间格式化符号四、时间元组1.时间元组:2.struct_time元组的属性 五、time库可以干什么总结 前言 大家好呀,BOBO仔回来啦。 说实话,这几天我们学习面向对象的…

代码随想录刷题day13|(链表篇)24.两两交换链表中的结点

目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可,有两个关键点,一是循环何时终止?终止…

PIC单片机设置bootloader程序和app程序地址方法

在调试bootloader和app程序的时候通常都需要设置程序的偏移地址,下面就总结一下使用MPLAB X IDE 设置程序地址的方法。 打开bootloader工程 工程上单击鼠标右键,选择Properties,打工工程属性窗口。 此时会打开项目属性对话框 左边类别选择XC8 Line…

51c大模型~合集105

我自己的原文哦~ https://blog.51cto.com/whaosoft/13101924 #刚刚,ChatGPT开始有了执行力! 现在 AI 智能体可以 24*7 小时为你打工。 2025 刚过去了半个月,OpenAI 在智能体领域「开大」了。 今天,OpenAI 正在为 ChatGPT 推出…

迅为龙芯2K1000开发板/核心板流畅运行Busybox、Buildroot、Loognix、QT5.12系统

硬件配置 国产龙芯处理器,双核64位系统,板载2G DDR3内存,流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 接口全板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIF1、蓝牙、Mini H…

StarRocks强大的实时数据分析

代码仓库:https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始:StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化…

web前端1--基础

(时隔数月我又来写笔记啦~) 1、下载vscode 1、官网下载:Visual Studio Code - Code Editing. Redefined 2、步骤: 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…

基于tldextract提取URL里的子域名、主域名、顶级域

TLD是TopLevel Domain的缩写。‌tldextract‌ 是一个用于从URL中提取子域、主域名和顶级域(TLD)的Python库。它利用公共后缀列表(Public Suffix List)来确保即使是复杂或不常见的URL结构也能被正确解析。tldextract能够处理包括IC…

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似,区别就在于预处理部分存在不同;本文简单介绍了下音频处理的方法,以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…

数据结构之堆排序

文章目录 堆排序版本一图文理解 版本二向下调整建堆向上调整建堆 排升/降序升序 堆排序 版本一 基于已有数组建堆取堆顶元素并删除堆顶元素重新建大根堆,完成排序版本。 图文理解 版本二 前提:必须提供有现成的数据结构堆 数组建堆,首尾…

小菜鸟系统学习Python第三天

1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue

常用排序算法之插入排序

目录 前言 一、基本原理 1.算法步骤 2.动画演示 3.插入排序的实现代码 二、插入排序的时间复杂度 1. 时间复杂度 1.最优时间复杂度 2.最差时间复杂度 3.平均时间复杂度 2. 空间复杂度 三、插入排序的优缺点 1.优点 2.缺点 四、插入排序的改进与变种 五、插入排…

数据分析及应用:经营分析中的综合指标解析与应用

目录 1. 市场份额(Market Share) 2. 客户获取成本(Customer Acquisition Cost, CAC) 3. 客户生命周期价值(Customer Lifetime Value, CLV) 4. 客户留存率(Customer Retention Rate, CRR) 5. 净推荐值(Net Promoter Score, NPS) 6. 转化率(Conversion Rate) …

工业相机 SDK 二次开发-Halcon 插件

本文介绍了 Halcon 连接相机时插件的使用。通过本套插件可连接海康 的工业相机。 一. 环境配置 1. 拷贝动态库 在 用 户 安 装 MVS 目 录 下 按 照 如 下 路 径 Development\ThirdPartyPlatformAdapter 找到目录为 HalconHDevelop 的文 件夹,根据 Halcon 版本找到对…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…