A. 痛点描述(Problem)#
正则替换是工程里最“高收益也最高风险”的操作之一:
- 高收益:一条规则能批量修复、统一格式、清洗数据、脱敏日志
- 高风险:一个边界没写好,就可能误伤大量内容,甚至把关键字段清空
因此替换要做到两件事:
- 规则足够明确(尽可能少“吞多了”的空间)
- 替换前有可靠的预览与回归(至少在样本集上验证)
工具入口:正则表达式测试(含替换预览)
👉 立即使用:正则表达式测试
B. 核心原理(Deep Dive)——替换模板到底能写什么?#
本站替换语义以 JavaScript
String.prototype.replace为准。
1)最重要的:捕获分组与 $1 $2#
- 用
(...)捕获分组 - 在替换模板里用
$1、$2… 引用对应分组
例:把 alice@example.com 改写成 alice at example.com
- 正则:
(\w+)@([\w.]+) - 替换:
$1 at $2
2)常见替换占位符(JS 语义)#
$&:整段命中内容(match[0])- ``$```:命中前的文本
$':命中后的文本$$:输出$字符本身
工程里最常用的是 $1..$n 和 $&。
3)为什么要警惕 .* 与贪婪量词?#
当你用 .* 把中间内容“全吞掉”,替换时往往会吃到你不想替换的范围。
对替换来说,更好的策略是:
- 用更明确的字符类(例如
[^"]+、[^\s]+) - 或者用懒惰量词
.*?配合明确边界
C. 操作指南(Step-by-step)——替换前的“安全流程”#
- 先写“匹配”规则,让命中结果完全符合预期(看表格:命中内容/位置/分组)
- 再写替换模板,并观察“替换预览”
- 用多组样本验证边界:正常值、空值、极端值、含特殊字符值
- 最后点“代码生成”,导出到你的语言环境写回归(或至少保留可运行示例)
D. 可复制的替换方案(清洗/统一/脱敏)#
1)统一空格:连续空格变单空格#
- 正则:
\s+ - 替换:
- flags:
g
适用:日志、用户输入、复制粘贴带来的多余空白。
2)统一换行:Windows \r\n 转 \n#
- 正则:
\r\n - 替换:
\n - flags:
g
适用:跨平台文本、配置内容、脚本拼接。
3)手机号脱敏(中间四位打码)#
输入:13812345678
输出:138****5678
- 正则:
^(1[3-9]\d{2})\d{4}(\d{4})$ - 替换:
$1****$2
注意:这是“整串校验 + 脱敏”。如果你在一段文本里做提取式脱敏,建议改用更宽松的匹配并配合边界(如下)。
在文本中脱敏(尽量避免命中身份证等相似数字):
- 正则:
(?<!\d)(1[3-9]\d{2})\d{4}(\d{4})(?!\d) - 替换:
$1****$2
如果目标环境不支持 lookbehind,可退化为:
- 正则:
(^|[^\d])(1[3-9]\d{2})\d{4}(\d{4})(?!\d) - 替换:
$1$2****$3
4)邮箱脱敏:只保留首尾与域名#
输入:alice@example.com
输出:a***e@example.com
- 正则:
^(.)(.*)(.)@([\w.-]+\.[A-Za-z]{2,})$ - 替换:
$1***$3@$4
注意:这是工程实用版,不覆盖所有 RFC 复杂邮箱形式。
5)URL 参数清洗:去掉敏感 query(token、secret 等)#
如果你希望把 URL 里 token=... 这一段替换成固定值:
- 正则:
([?&]token=)[^&]+ - 替换:
$1*** - flags:
g
同理适用于 secret、password、key 等参数名。
6)日志脱敏:Bearer Token 打码#
输入:
Authorization: Bearer eyJhbGciOi...
输出:
-
Authorization: Bearer *** -
正则:
(Authorization:\s*Bearer\s+)[A-Za-z0-9._-]+ -
替换:
$1*** -
flags:
gi
注意:token 可能包含 + / 等字符时(例如某些 Base64 形式),可放宽为:
(Authorization:\s*Bearer\s+)[^\s]+
7)把日志中的 key=value 转为 JSON 友好格式(示意)#
输入:
user=42 trace_id=abc123 cost=12ms
把空格替换为逗号分隔:
- 正则:
\s+ - 替换:
, - flags:
g
然后你可以进一步用 JSON 工作台整理为结构化数据:
立即使用工具
E. 常见问题(FAQ)#
1)为什么替换后结果“少了一大段”?#
很可能是你的匹配范围过宽(例如 .* 贪婪吞掉了不该吞的部分)。建议先只做匹配验证,看每条命中到底覆盖了哪些字符。
2)为什么 $1 没替换出来?#
通常是你没有捕获分组(用了 (?:...) 或压根没写括号),或分组编号与你预期不一致。直接看“匹配结果表格”的分组列确认。
3)为什么工具里能替换,写进代码后不对?#
常见原因是字符串转义:你在代码里写正则字符串时,需要双重转义(例如 \\d)。建议用工具里的“代码生成”导出后再落地。
工具推荐#
- 正则表达式测试(匹配/替换预览/导出/代码生成):立即使用:正则表达式测试
- JSON 工作台(清洗后结构化):立即使用工具
