JS 字符串替换中的正则用法
替换接口的第二个参数既可以是带占位符的模板字符串,也可以是函数。模板形式写起来短,但占位符里的美元符号有特殊含义,容易与业务文本冲突;函数形式能拿到分组、匹配位置与整段原文,适合需要判断或查表的改写。默认只替换第一处,除非正则带全局标志。
基本信息
| 接口形态 | 替换方法接收搜索值(字符串或正则)与替换值(字符串或函数) |
|---|---|
| 模板占位符 | 美元符号后接特定字符表示整体匹配、匹配前文本、匹配后文本与分组引用 |
| 回调参数 | 依次是整体匹配、各捕获组、匹配位置、原字符串,以及命名分组对象 |
| 替换次数 | 不带全局标志只替换第一处;全量替换的接口要求正则带全局标志 |
典型使用场景
- 格式改写:把日期分隔符、单位写法统一为规范形式
- 脱敏:按模式把敏感片段替换成掩码,日志输出前统一处理
- 占位符渲染:把模板中的变量名替换为实际取值
- 条件改写:根据匹配到的分组内容决定替换结果,用回调集中处理
- 跨语言移植:把其他语言的替换引用语法改写为本地写法时注意占位符差异
替换写法实测
替换写法实测
'ab'.replace(/a/, '[$&]'); // '[a]b':整体匹配的占位符
'ab'.replace(/(?<x>a)/, '$<x>$<x>'); // 'aab':命名分组引用
'abc'.replace(/b/, '$$'); // 'a$c':双美元符号表示字面美元符号
'a1b2'.replace(/\d/, '#'); // 'a#b2':只替换第一处
'a1b2'.replace(/\d/g, '#'); // 'a#b#':带上全局标志才全量替换
'a1b2'.replaceAll(/\d/g, '#'); // 全量替换接口,传非全局正则会抛类型错误
'a-1'.replace(/(\w)-(\d)/, (...args) => JSON.stringify(args.slice(0, 3)));模板占位符与回调
| 形式 | 含义 | 注意 |
|---|---|---|
| 美元符号加单个符号 | 整体匹配 | 业务文本里出现美元符号需转义 |
| 美元符号加数字 | 按序号引用捕获组 | 超过两位数字的组号写法有限制 |
| 美元符号加尖括号 | 按名字引用捕获组 | 模式里必须有同名分组 |
| 回调函数 | 自行计算替换内容 | 参数顺序固定,命名分组对象在最后 |
| 全量替换接口 | 替换所有匹配 | 正则必须带全局标志 |
| 字符串形式的搜索值 | 按字面替换 | 只有第一次出现被替换 |
回调的返回值为空值时会被转换成字符串写进结果,例如返回空值会得到字面量文本而不是被跳过;需要在某些情况下保持原样时,应显式返回整体匹配内容。
业务文本中如果包含美元符号或形似占位符的片段,模板方式会误解释;这类场景改用回调函数最稳,回调返回的字符串不会再被当作模板解析。