开发工具指南

正则表达式怎么用正反例先测出来?

写好正则后先准备应该匹配和绝不能匹配的样本,再检查边界、全局标志和误匹配,降低批量处理文字的风险。

撰文: 3sec 编辑部 4 分钟阅读 1717 字

正则写完后,先同时放入“应该匹配”和“绝不能匹配”的样本。只拿一个正确邮箱或日期测试,最多只能证明规则碰巧成功一次,无法说明批量处理时不会抓错。

先写测试样本,再写表达式

先把真实任务缩成一小组可公开的样本,并给每一行标记预期结果。正例用来确认规则没有漏掉目标,反例用来暴露范围过宽,边界值则检查空格、换行、大小写和分隔符。

例如要从报名名单里找出形如 2026-07-28 的日期,可以准备这些内容:

  • 应该匹配:2026-07-28、2027-01-05
  • 不应匹配:2026/07/28、26-07-28、版本2026-07-28备份
  • 边界样本:行首日期、行尾日期、日期前后有空格、同一行出现两次日期

把样本和表达式放进 Regex 测试器 后,工具会使用浏览器的 JavaScript RegExp,即时高亮匹配文字并列出位置。它能显示规则抓到了哪里,却不知道你的业务含义,所以“显示两个匹配”不代表这两个结果都正确。

用边界控制整段匹配还是局部查找

是否加 ^ 和 $,取决于你要验证整段输入,还是从长文本中找片段。验证单个字段时通常要限制开头和结尾;扫描日志或多行名单时,过强的边界反而会漏掉目标。

以简单邮箱规则为例,^[\w.+-]+@[\w-]+\.[\w.-]+$ 适合检查整格内容是否大致符合结构。去掉首尾边界后,它可能从一句话里找到邮箱片段。这个例子不是完整的邮箱标准验证,带引号、本地化域名或特殊合法写法可能不符合;正式注册仍应由后端验证,并通过确认邮件判断地址是否可用。

日期也有类似限制。表达式能限制成四位年、两位月和两位日,但 2026-02-31 仍可能通过格式检查。正则适合确认字符结构,不适合代替日历计算。需要真实日期时,应在匹配后再交给日期解析逻辑验证。

看懂 g、i 和 m 对结果的影响

标志会改变同一个表达式的行为,测试时必须记录使用了哪些标志。没有 g 时,当前工具只显示第一次匹配;加入 g 才会继续找完整段文字中的其他结果。

  • g 用于找出全部匹配,适合清点名单或日志中的每个目标。
  • i 忽略英文字母大小写,适合不区分 Error 和 error 的查找。
  • m 让 ^ 与 $ 针对多行文字中的每一行,而不只是整段输入。
  • s 会让点号也匹配换行,范围可能突然跨过多个段落,必须加入反例。

例如要找每一行开头的工单号,可以用 ^TKT-\d{6} 搭配 gm。测试文本里应同时放入正确的 TKT-123456、少一位的 TKT-12345、前面有空格的行,以及正文中间出现的编号。这样才能看出规则究竟要求严格行首,还是应该容许缩进。

替换前先防止零长度与贪婪匹配

当前 Regex 测试器只负责匹配和高亮,不会执行文字替换。若准备在编辑器、脚本或数据清理工具中批量替换,应先在这里确认匹配范围,再到目标环境用同一套 JavaScript 语法复查;不同语言的正则实现可能不完全相同。

容易出问题的情况包括:

  • .* 抓得太长,把两个分隔符之间以外的内容也吞进去。
  • 可选条件太多,产生空字符串匹配,导致替换位置不断增加。
  • 没有转义点号,原本要找 . 却匹配了任意字符。
  • 忘记 g,测试只看到第一处,实际需求却是整份替换。
  • 把敏感的真实客户资料当成测试文本,而不是使用脱敏样本。

比如计划把 2026/07/28 改为 2026-07-28,可以先用 (\d{4})/(\d{2})/(\d{2}) 检查哪些片段会被选中。工具不会展示或执行 $1-$2-$3 的替换结果;请在实际替换环境处理一个副本,再用 文字差异比对 检查修改前后是否只改变了预期位置。

把正反例保存成回归清单

一条正则在今天的数据上通过,不代表下个月增加新格式后仍然合适。保留不含隐私的正反例,每次修改表达式都重新跑一遍,能防止修好一个漏匹配却引入新的误匹配。

可以按实际任务维护三组内容:最常见的正常输入、过去出现过的异常输入、绝不能被处理的相似字符串。处理 JSON 日志时,先用 JSON 格式化器 验证并排版样本,再复制需要检查的文字字段;正则测试器不是 JSON 解析器,不能证明整份 JSON 结构有效。

最后在小批副本上执行真正的替换或筛选,统计修改数量,并抽查开头、中间和结尾。匹配数量异常时先停下,回到样本补充反例,不要直接把更宽的表达式用于全部数据。

常见问题

为什么只高亮了第一处匹配?

检查标志栏是否包含 g。没有全局标志时,JavaScript 正则只返回第一次匹配,适合验证单个字段,但不适合清点长文本中的所有结果。

正则能准确判断一个邮箱是否真实存在吗?

不能。正则只能检查文字结构,无法确认邮箱能否收信、域名是否有效或地址是否属于某个人。注册流程仍要使用后端验证和确认邮件。

日期格式匹配成功,为什么仍可能是错误日期?

字符格式正确不等于日历日期有效。像 2026-02-31 可能符合年、月、日的位数规则,但仍需要日期解析程序检查。

这个工具可以直接批量替换文字吗?

不可以。Regex 测试器只显示匹配和位置,不提供替换输出。请先处理副本,并在实际替换工具中确认语法和结果。

为什么同一条正则在 Python 里结果不同?

当前工具使用浏览器的 JavaScript RegExp。Python、Java、PCRE 等实现支持的语法、标志与边界行为可能不同,应在最终运行环境再次测试。