JavaScript RegExp 正则表达式

news/2025/2/21 7:41:58/文章来源:https://www.cnblogs.com/dawnkylin/p/18723992

如有错误和建议请评论告知。

RegExp

RegExp 类型的字面量写法:

let expression = /pattern/flags;

这个正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式。

正则表达式的标记

每个正则表达式可以带零个或多个 flags(标记),用于控制正则表达式的行为。

标记 功能 示例及解释
g 全局匹配:查找所有匹配,而非找到第一个就停止。 console.log("abcabc".match(/a/g)); // 输出:["a", "a"]
i 忽略大小写:匹配时不区分大小写。 console.log("Abc".match(/a/i)); // 输出:["A"]
m 多行模式:^和`
--- --- ---
标记 功能 示例及解释
g 全局匹配:查找所有匹配,而非找到第一个就停止。 console.log("abcabc".match(/a/g)); // 输出:["a", "a"]
i 忽略大小写:匹配时不区分大小写。 console.log("Abc".match(/a/i)); // 输出:["A"]
匹配每一行的开头和结尾。 console.log("a\nb".match(/^b/m)); // 输出:["b"]
s 单行模式(dotAll 模式):.
匹配包括换行符。
console.log("a\nb".match(/a.b/s)); // 输出:["a\nb"]
u Unicode 模式:支持 Unicode 的完整字符匹配。 console.log("\u{1F600}".match(/\u{1F600}/u)); // 输出:[""]
y 粘性匹配:从当前位置开始匹配,且不回溯。 let re = /a/y; re.lastIndex = 1; console.log(re.test("ba")); // true
d 匹配索引:返回匹配项在字符串中的索引(ES2022)。 console.log("abcabc".matchAll(/a/d)); // { index: 0 }, { index: 3 }

正则表达式的元字符

1.字符匹配元字符

元字符 用途 示例
. 匹配任意单个字符(除换行符)。 /a.b/匹配 "acb", "a1b",但不匹配 "ab", "a\nb"
\d 匹配任意数字(相当于 [0-9]
)。
/\d+/匹配 "12345"中的 "12345"
\D 匹配非数字字符(相当于 [^0-9])。 /\D+/匹配 "abc",但不匹配 "123"
\w 匹配单词字符(字母、数字、下划线)。 /\w+/匹配 "hello_123"
\W 匹配非单词字符。 /\W+/匹配 "@!#"
\s 匹配空白字符(空格、制表符等)。 /\s+/匹配字符串中的空格。
\S 匹配非空白字符。 /\S+/匹配 "abc",但不匹配 " "
\b 匹配单词边界。 /\bcat\b/匹配 "cat",但不匹配 "catalog""scatter"
\B 匹配非单词边界。 /\Bcat\B/匹配 "scattering"中的 "cat"

2.定位元字符

元字符 用途 示例
^ 匹配字符串开头。 /^abc/匹配 "abc123"的开头 "abc",但不匹配 "123abc"
`
--- --- ---
元字符 用途 示例
^ 匹配字符串开头。 /^abc/匹配 "abc123"的开头 "abc",但不匹配 "123abc"
|匹配字符串结尾。|/abc$/匹配 "123abc"的结尾 "abc",但不匹配 "abc123"

3.重复元字符

元字符 用途 示例
* 匹配前一个字符 0 次或多次。 /a*/匹配 "aaa", "b"
, "ab"中的 "aaa", "", "a"
+ 匹配前一个字符 1 次或多次。 /a+/匹配 "aaa", "ab"中的"aaa", "a",但不匹配 "b"
? 匹配前一个字符 0 次或 1 次。 /a?b/匹配 "b", "ab",但不匹配 "aab"
{n} 匹配前一个字符 恰好 n 次 /a{3}/匹配 "aaa",但不匹配 "aa""aaaa"
{n,} 匹配前一个字符 至少 n 次 /a{2,}/匹配 "aaa", "aaaa",但不匹配 "a"
{n,m} 匹配前一个字符 至少 n 次,至多 m 次 /a{2,4}/匹配 "aa", "aaa", "aaaa",但不匹配 "a""aaaaa"

4.分组和选择元字符

元字符 用途 示例
() 定义分组,用于捕获或控制优先级。 /(ab)+/匹配 "ababab"中的 "ababab";捕获 "ab"
(?:) 定义非捕获分组,仅用于逻辑分组。 /(?:ab)+/匹配 "ababab"中的 "ababab",但不捕获 "ab"
` ` 逻辑或,匹配任意一个模式。

5.特殊元字符转义

元字符 用途 示例
\ 转义字符,用于匹配元字符的字面值。 /a\*b/匹配 "a*b",但不匹配 "ab"
\n 匹配换行符。 /a\nb/匹配字符串 "a\nb"
\t 匹配制表符。 /a\tb/匹配字符串 "a\tb"

6.字符集合和范围

元字符 用途 示例
[abc] 匹配字符集合中的任意一个字符。 /[abc]/匹配 "a", "b", "c",但不匹配 "d"
[^abc] 匹配不在集合中的任意字符。 /[^abc]/匹配 "d", "e",但不匹配 "a", "b", "c"
[a-z] 匹配字符范围内的任意字符。 /[a-z]/匹配 "a""z"中的任意小写字母。
[^a-z] 匹配不在范围内的任意字符。 /[^a-z]/匹配小写字母以外的字符。

7.断言元字符

元字符 用途 示例
(?=...) 正向先行断言:匹配后面跟随某模式的字符串。 /a(?=b)/匹配 "ab"中的 "a",但不匹配 "ac"
(?!...) 负向先行断言:匹配后面不跟随某模式的字符串。 /a(?!b)/匹配 "ac"中的 "a",但不匹配 "ab"
(?<=...) 正向后行断言:匹配前面有某模式的字符串(ES2018)。 /(?<=a)b/匹配 "ab"中的 "b",但不匹配 "cb"
(?<!...) 负向后行断言:匹配前面没有某模式的字符串(ES2018)。 /(?<!a)b/匹配 "cb"中的 "b",但不匹配 "ab"

要匹配上面这些字符本身,必须使用反斜杠来转义:

// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i;
// 匹配第一个"[bc]at",忽略大小写
let pattern2 = /\[bc\]at/i;
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
// 匹配所有".at",忽略大小写
let pattern4 = /\.at/gi;

RegExp 构造函数

构造函数形式:

new RegExp(pattern, flags)
// 示例:
new RegExp('ab+c', 'i')

注意事项:

  • 转义字符:构造函数中的模式需作为字符串传递,反斜杠需双重转义。
  • 动态构建:构造函数适合动态生成正则表达式(如拼接变量)。
  • 修饰符覆盖:若第一个参数是正则对象,第二个参数会覆盖其修饰符。

RegExp 实例属性

RegeExp 实例拥有提供有关模式各方面信息的属性。

修饰符相关(只读布尔值):

  • .global(g):是否全局匹配。
  • .ignoreCase(i):是否忽略大小写。
  • .multiline(m):是否多行模式。
  • .dotAll(s):是否允许.匹配换行符(ES6+)。
  • .unicode(u):是否启用Unicode模式(ES6+)。
  • .sticky(y):是否粘性匹配(ES6+)。

其他属性:

  • .source:正则表达式的模式文本(如 /abc/ 的 source 是 "abc")。
  • .flags:所有修饰符的字符串(如 /abc/gi 的 flags 是 "gi")。
  • .lastIndex:下次匹配的起始位置(仅在 g 或 y 模式下生效)。

RegExp 实例方法

test()

检测字符串是否匹配,返回布尔值。

若正则启用 g/y,每次调用会更新 .lastIndex

const regex = /a/g;
const str = 'abc';
regex.test(str); // true(lastIndex 变为 1)
regex.test(str); // false(从索引 1 开始无匹配,lastIndex 重置为 0)

exec()

返回匹配结果的数组(无匹配时返回 null)。

  • 数组包含完整匹配、捕获组、index(匹配位置)和 input(原始字符串)。
  • 启用 g/y 时,重复调用可遍历所有匹配,因为每次匹配会从更新后的 lastIndex 开始。
const regex = /a(b)(c)/d;
const result = regex.exec('abc');
console.log(result[0]);    // 'abc'(完整匹配)
console.log(result[1]);    // 'b'(第一个捕获组)
console.log(result.index); // 0(匹配位置)
console.log(result.indices); // [[0,3], [1,2], [2,3]](匹配的索引,需'd'标志)

RegExp 构造函数属性

RegExp 的静态属性,保存最近一次匹配的上下文(慎用,可能引发全局状态问题)。

每个属性都有一个全名和一个简写。常用属性:

  • RegExp.inputRegExp.$_):最近一次被匹配的字符串。
  • RegExp.lastMatchRegExp['$&']):最近一次匹配的文本。
  • RegExp.lastParenRegExp['$+']):最近一次匹配的最后一个捕获组。
  • RegExp.leftContextRegExp['$']`):匹配文本左侧的字符串。
  • RegExp.rightContextRegExp["$'"]):匹配文本右侧的字符串。
  • RegExp.$1~RegExp.$9:第 1 到第 9 个捕获组的内容。
const regex = /(\d+)-(\d+)/;
regex.test('123-456');
console.log(RegExp.$1);        // '123'
console.log(RegExp.lastMatch); // '123-456'
console.log(RegExp.leftContext); // ''(匹配在字符串开头)

RegExp 构造函数的所有属性都没有任何 Web 标准出处,因此不要在生产环境中使用它们

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

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

相关文章

Centos系统nginx自动续约https证书Lets Encrypt

Nginx官网 https://www.nginx-cn.net/ Lets Encrypt官网 https://letsencrypt.org/zh-cn/how-it-works/ 一、安装nginxsudo yum install nginx上面是直接安装到默认位置,如果是通过wget下载,安装在其他目录下,就需要稍微配置下。wget https://nginx.org/download/nginx-1.1…

Stable Diffusion AI绘图教程:从基础到高级,AI绘图一网打尽

在 AI 绘画领域,StableDiffusion 以其强大的功能和丰富的创意表现,成为众多创作者热衷探索的工具。今天,就为大家详细介绍一系列围绕 StableDiffusion 展开的学习资源,涵盖从基础到高阶、从功能解析到实际应用的全方位内容。 一、基础入门篇 kc开篇:“1 - 全面掌握 Stable…

龙哥量化:用deepseek编程要学习的公式编程的基础知识和常用的功能模块

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔)我自己在公式编程非常熟练了,但是遇到deepseek的时候,非常惊喜,能理解我的思路, 也能明白我提出的修改思路,真…

电商与ChatGPT结合:如何利用AI提升销售额,案例分析及应用策略

在当今数字化浪潮中,AI技术正以前所未有的速度渗透到各个行业,电商直播带货领域也不例外。 曾经一个5人团队,在团队规模恒定的情况下,巧妙借助ChatGPT与各类软件的融合之力,成功实现了年销售额从2000万跃升至2500万甚至3000万的飞跃,这无疑彰显了AI在电商领域的巨大潜力。…

逻辑推理

肯前比肯后 否后比否前 肯后否前无必然联系 前推后 如果 就 都 一定 后推前 只有 ...才 ... 除非。。。否则不 。。。 B -> A 除非。。。否则 。。。 -B -> A 谁必不可少 谁就在箭头后面 或关系 否一推一 如 A或B为真 -A->B/ -B-> A 快速做题 - 排除出现…

BTB04-ASEMI电动工具专用BTB04

BTB04-ASEMI电动工具专用BTB04编辑:ll BTB04-ASEMI电动工具专用BTB04 型号:BTB04 品牌:ASEMI 封装:TO-220F 正向电流:8A 反向电压:600V~800V 引脚数量:3 芯片个数:2 芯片尺寸: 漏电流:>10ua 恢复时间: 包装方式:管装 封装尺寸:如图 特性:双向可控硅 工作结温:…

10款最适合大数据项目管理工具(2025年)

在当今数据驱动的时代,大数据项目管理已成为企业成功的关键因素之一。随着数据量的爆炸式增长,传统的项目管理方法已无法满足需求,企业需要借助专业的软件工具来高效管理复杂的大数据项目。本文将为您介绍10款最适合大数据项目管理的软件工具,帮助您在2025年及未来更好地应…

第十六章 采购管理(2025年详细解析版)

目录导学什么是采购管理?定义内容16.1 管理基础什么是协议定义协议的形式什么是合同定义内容合同注意事项项目采购与项目管理项目买卖方内部卖方招投标的流程发展趋势和新兴实践(了解)采购新趋势16.2 项目采购管理过程项目采购管理过程ITTO裁剪时需要考虑的因素在敏捷或适应…

面试官:说说你项目中JWT的执行流程?

JWT 在目前的项目开发中使用到的频率是非常高的,因此它也是面试常问的一类问题,所以今天我们就来看看“项目中 JWT 的执行流程?”这个问题。 1.什么是 JWT? JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。…

【日记】文竹已经长得比路灯还要高了(1069 字)

正文最近陷入了一个深刻的情感漩涡。一边有些嫌恶爱情,一边又为它焦虑。一边觉得自己只有友谊已经足够了,一边又看见大多数友情并不能如爱情一般陪伴那样长的时间,不说二三十年,甚至不到十年可能便会消亡。觉得其实自己仍然需要它。然而目前这个不太喜欢、又需要一个东西的…

苹果使用AI让皮克斯的灯具复活了。

苹果让皮克斯著名的开场灯具复活,发布了一项新的研究,其中描述它的形容词并不是你通常会在AI研究中使用的那些。 这与我们习惯的一切都不同。它在技术上并不更聪明、更强大,也不是那些害怕AI的人噩梦般的存在。 相反,它似乎是科技巨头首次尝试以不同的方向提升AI和机器人智…