小算云箱小算云箱
← 返回使用指南

正则替换实战:批量清洗、格式统一与日志脱敏(含替换模板技巧)

2026-05-08小算团队开发辅助

围绕 replace 的真实工程需求,讲清分组引用、贪婪/懒惰、边界控制与替换模板写法($1、$& 等),并给出手机号/邮箱/Token 脱敏与日志清洗的可复制方案;配合小算云箱正则工具预览替换结果与生成代码。

A. 痛点描述(Problem)#

正则替换是工程里最“高收益也最高风险”的操作之一:

  • 高收益:一条规则能批量修复、统一格式、清洗数据、脱敏日志
  • 高风险:一个边界没写好,就可能误伤大量内容,甚至把关键字段清空

因此替换要做到两件事:

  1. 规则足够明确(尽可能少“吞多了”的空间)
  2. 替换前有可靠的预览与回归(至少在样本集上验证)

工具入口:正则表达式测试(含替换预览)
👉 立即使用:正则表达式测试


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)——替换前的“安全流程”#

👉 立即使用:正则表达式测试

  1. 先写“匹配”规则,让命中结果完全符合预期(看表格:命中内容/位置/分组)
  2. 再写替换模板,并观察“替换预览”
  3. 用多组样本验证边界:正常值、空值、极端值、含特殊字符值
  4. 最后点“代码生成”,导出到你的语言环境写回归(或至少保留可运行示例)

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

同理适用于 secretpasswordkey 等参数名。


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)。建议用工具里的“代码生成”导出后再落地。


工具推荐#