JavaScript正则表达式是内建工具,可用字面量(/pattern/)或RegExp构造函数创建;静态模式用字面量,动态拼接用new RegExp()并注意双重转义;match()与exec()行为不同,replace()支持$1等捕获组引用。

JavaScript 正则表达式是内建的文本匹配与操作工具,不是额外库,直接用 RegExp 构造函数或字面量(如 /abc/)创建,所有字符串方法(match()、replace()、test() 等)都原生支持它。
正则字面量 vs new RegExp():什么时候该用哪个
字面量(/pattern/flags)写法简洁,适合静态模式;new RegExp() 适合动态拼接——比如从用户输入或变量中构建正则。但要注意:new RegExp("a.b") 中的点号会被 JS 字符串先转义一次,必须写成 "a\\.b" 才等价于字面量 /a\.b/。
- 固定规则(如邮箱基础校验)→ 用
/^[^\s@]+@[^\s@]+\.[^\s@]+$/ - 搜索高亮关键词 → 拼接变量时用
new RegExp(escapeRegExp(keyword), "gi"),其中escapeRegExp()需手动实现转义特殊字符 - 标志位
g(全局)、i(忽略大小写)、m(多行)只能在字面量末尾或构造函数第二个参数传入,不能运行时修改
match() 和 exec() 的关键区别:别在循环里错用 match()
match() 对带 g 标志的正则返回字符串数组(只含匹配内容),不带 g 则返回详细对象(含 index、input);而 exec() 总是返回详细对象,且会维护 lastIndex 属性,适合手动控制匹配位置。
- 想一次性拿到所有匹配结果 → 用
str.match(/a/g) - 需要每个匹配的起始位置或捕获组 → 用
reg.exec(str)循环,注意每次调用前确认reg.lastIndex = 0或使用无g标志的正则 - 错误写法:
while ((m = /a/g.exec(str)) !== null)—— 因为/a/g是字面量,每次都会新建实例,lastIndex始终为 0,变成死循环
replace() 中的 $1、$2 是什么:捕获组引用的正确姿势
replace() 的第二个参数可以是字符串或函数。字符串中 、 表示第一个、第二个捕获组(即括号内的子表达式)的匹配内容,$$ 表示单个 $ 字符。
Unix in a Nutshell同时涵盖了许多重要的、业界标准的开放源码工具 本书还完整地讨论了常用的shell(bash、ksh及tcsh)和重要元素如正则表达式,乃至旧式工具如sed、awk与vi。 Unix不是一个庞大的物体:它是一个综合体,而《Unix技术手册》则是将这一切合并在一起的一本书。 到底unix是什么?原始的unix源码是由sco拥有,unix注册商标是由open group拥有,而领先的仿unix系统则是gnu/linux、mac os x及solaris。这些版本所附的命令与选
立即学习“Java免费学习笔记(深入)”;
const text = "2023-12-25";
const result = text.replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1");
// → "12/25/2023"
- 捕获组数量必须和
$1、$2等对应,否则显示为空字符串 - 如果替换逻辑复杂(比如要转成大写、加前缀),务必改用函数:
text.replace(/(\w+)/g, (match, p1) => `【${p1.toUpperCase()}】`) - 注意:正则中未用括号包裹的部分(如
a+b)不会产生捕获组,$1无效
真正难的不是写出一个能跑的正则,而是预判边界情况:比如 \d+ 会把 "abc123def" 中的 123 提出来,但若文本是 "123abc456",默认贪婪匹配会让它吃掉整个 123abc456(因为 \d+ 后没跟任何限定符)。这时候得用 \d+(?=[^0-9]|$) 或非贪婪 \d+?,具体选哪个,取决于你到底想切分还是提取。








