悦省

批量查找替换

支持正则与捕获组($1 引用),替换前先看命中数。


  
正则提示

用 (\d+) 这样的捕获组时,替换框里用 $1 引用;$& 表示整个匹配。写错正则会立刻报错,不会改到文本。

什么时候用

  • 导出数据里混着全角括号、连续空格和不换行空格(U+00A0),要一次清干净:正则写 [\u00A0 ]+ 比手改几十处快。
  • 把 2024-01-05 这种日期批量改成 2024/01/05,或在每个手机号前加国家码,同时用捕获组保留原来的数字时。

什么时候不用

  • 需要跨行匹配或让 ^ $ 按行生效:本页固定用 g 和可选的 i,没有 m 和 s,^ 只匹配整段开头,. 也不跨行。
  • 替换规则需要条件判断(不同情况换成不同内容,或要计算新值):写脚本(sed、Python)比堆正则更可靠。
限制与隐私

替换在本地完成,文本不上传。限制:正则固定用 g 和可选的 i,没有 m/s/u,所以 ^ $ 只对整段生效、. 不跨行、\p{...} 不可用;只当纯文本处理,不解析 HTML/CSV 结构;几 MB 以上的文本一次性替换会明显卡顿。

常见问题

正则写错会不会把原文改坏?

不会。输入框的内容从不被写回,结果只出现在输出框;正则编译失败时替换根本不会执行,输出框保持上一次的结果。问题在于错误信息只出现在浏览器控制台,页面上不一定有提示,点了没反应通常就是正则有问题(括号没闭合、[ 没有配 ])。

为什么 \p{L} 或 \u{1F600} 匹配不到东西?

正则用 new RegExp(..., 'gi') 构建,没有 u 标志,于是 \p 被当成普通字母 p,\u{1F600} 被当成字面量 u{1F600},不报错但匹配不到。要用 Unicode 属性或码点转义,只能改写成代理对(如 \uD83D\uDE00)或直接写具体字符。

替换框里的 $1、
amp; 是什么?没有第 2 个括号会怎样?

$1 引用第 1 个捕获组,amp; 是整个匹配,$ 是一个美元符号。引用了不存在的组(比如只有一组括号却写 $2)时,$2 会原样留在结果里。普通(非正则)模式也走 replace 的替换语法,所以替换内容里的 amp; 同样生效。