$1、$2等是正则捕获组的引用,按括号从左到右编号,用于replace()中直接重组字符串;如日期"2023-04-15".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")得"04/15/2023"。

在 JavaScript 的 replace() 方法中,用 $1、$2 等捕获组引用,可以不写回调函数,直接按需重组字符串结构——特别适合调整日期、姓名、路径等固定格式数据的顺序。
理解 $1、$2 是什么
正则表达式中每一对圆括号 () 就是一个捕获组,按从左到右顺序编号。匹配成功后,$1 表示第一个括号里的内容,$2 是第二个,以此类推。
例如:"2023-04-15".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1") → "04/15/2023"。
常见排列调整场景与写法
以下操作都不需要写函数,一行 replace() 即可完成:
-
年月日 → 月/日/年:
str.replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1") -
“姓, 名” → “名 姓”:
str.replace(/(\w+),\s*(\w+)/, "$2 $1")(支持带空格的逗号分隔) -
文件路径提取并倒序:
"/a/b/c.txt".replace(/\/([^/]+)\/([^/]+)\/([^/]+)/, "$3-$2-$1")→"c.txt-b-a" -
保留部分、交换其余:
"ID123-ABC-XYZ".replace(/(ID\d+)-(\w+)-(\w+)/, "$1-$3-$2")→"ID123-XYZ-ABC"
注意边界和转义细节
$ 符号只在 replace() 的替换字符串中有特殊含义;如果真想输出字面量 $1,要写成 $$1。
另外,正则本身要加全局标志 g 才能批量处理多处匹配,否则只替换第一个:
- 单次替换:
"a1 b2 c3".replace(/([a-z])(\d)/, "$2$1")→"1a b2 c3" - 全部替换:
"a1 b2 c3".replace(/([a-z])(\d)/g, "$2$1")→"1a 2b 3c"
进阶:混用字面量与 $n 更灵活
替换字符串里可以自由组合:$1 后接固定文字、空格、甚至另一个 $2,无需拼接:
- 给手机号加括号和短横:
"13812345678".replace(/(\d{3})(\d{4})(\d{4})/, "($1) $2-$3")→"(138) 1234-5678" - URL 路径转小写并加前缀:
"/User/Profile".replace(/\/(\w+)/g, "/$1".toLowerCase())不行($1在字符串里无法调方法),但可写成:"/User/Profile".replace(/\/(\w+)/g, (_, p1) => `/${p1.toLowerCase()}`)—— 这时就得用函数了,$n方式不支持运行时计算。
用好 $1 等引用,能让简单格式转换变得极其简洁。关键是把原始结构用括号“框出来”,再按目标顺序把 $1、$2 拼回去。


















