正则测试

文本

在线正则表达式测试与替换

正则写起来快,验证起来慢。真正耗时间的从来不是想出那串符号,而是反复确认它在边界情况下的行为:多一个空格还匹配吗,跨行的时候点号管不管用,第二个分组到底捕到了什么。在代码里加 console.log 试一轮要重启服务,效率很低。

这个页面把这个循环压缩到了一次输入。上方填表达式,两侧的斜杠已经画好,修饰符用勾选框选;下方粘测试文本,停手片刻就自动跑一遍。右栏逐条列出每一处匹配,带上它在原文中的起止下标和各个编号分组的值——分组这一项尤其有用,很多规则看起来「匹配上了」,其实捕获的范围和你以为的不一样。

替换是独立的一步。在「替换为」里填内容后执行,结果会单独出现在下方卡片里,$1$2 引用分组,$& 代表整段匹配,语义与 JavaScript 的 String.replace 一致。左侧测试文本不会被改写,所以可以反复调整替换串对比效果,满意了再复制走。底部的六个常用模板(邮箱、手机号、URL、身份证、IPv4、中文)点一下就填好表达式和修饰符,既能直接用,也适合当作改写的起点。

需要留意引擎差异:这里跑的是浏览器原生的 JavaScript 正则,和 Python 的 re、PHP 的 PCRE 不完全等价。命名分组只按编号展示,(?P<name>) 这类写法无效,\A\z 锚点也不支持。如果你的规则最终要用在后端,验证通过后仍建议在目标语言里复核一遍。

和需要注册或有调用次数限制的在线正则服务不同,这里所有匹配都在你的浏览器里完成,页面加载后断网也能用,测试文本不会离开本机。这意味着你可以直接把真实日志、含手机号的导出数据贴进来调规则,不用先花时间造假数据。最后提醒一句:嵌套量词容易引发灾难性回溯,页面会因此卡死,先在短文本上验证是个便宜的习惯。

功能一览

  • 实时匹配:改动表达式、修饰符或测试文本后自动重跑,也可随时手动点「测试」
  • 匹配明细:逐条列出匹配到的文本、它在原文中的起止下标,以及每个编号分组的值
  • 修饰符开关:g 全局、i 忽略大小写、m 多行、s 让点号匹配换行、u 启用 Unicode,可任意组合
  • 替换预览:填入替换内容后执行,结果单独成卡片展示并可复制,左侧测试文本不会被改动
  • 语法校验:表达式非法时立即提示浏览器给出的具体原因,不会静默失败
  • 常用模板:邮箱、手机号、URL、身份证、IPv4、中文六个预设,点一下即填好表达式与修饰符
  • 复制匹配:把所有匹配到的文本按行复制到剪贴板,可直接贴进表格或下一个工具
  • 原生引擎:使用浏览器自带的 JavaScript 正则引擎,行为与你在 JS 代码里写的完全一致

常见问题

测试文本会上传服务器吗?
不会。表达式通过浏览器原生的 RegExp 在本机执行,匹配与替换都不产生网络请求,页面加载后断网也能用。表达式、修饰符、测试文本和替换内容会缓存在浏览器 localStorage 里方便下次接着调,点「清空」即全部删除。因此可以直接拿真实日志、导出数据来验证规则,不必先做脱敏。
为什么只显示了一处匹配?
没有勾选 g 修饰符时,正则只返回第一个匹配,这与 JavaScript 中 RegExp.exec 的行为一致,勾上 g 就会列出全部。另外匹配数量有 5000 条上限,超过后会截断并提示收紧表达式。遇到这个提示通常说明表达式过于宽松,最常见的是写了能匹配空字符串的模式,例如整体加了星号量词。
这里的语法和 Python、PHP 里的正则一样吗?
不完全一样,本工具用的是 JavaScript 正则引擎。常用的字符类、量词、分组、前后断言写法是通用的,但命名分组在结果里只按编号展示;Python 的 (?P<name>) 写法在这里无效,需改写成 (?<name>);PHP 常用的 x 注释模式,以及 \A、\z、\Z 这几个锚点 JavaScript 都不支持,请改用脱字符和美元符号配合 m 修饰符。
替换里怎么引用匹配到的内容?
用 $1、$2 引用第一、第二个分组,$& 表示整段匹配,$$ 输出一个美元符号,规则与 JavaScript 的 String.replace 完全一致。想把匹配内容整体删掉,把替换框留空再执行即可。替换只在下方生成一份预览,左侧测试文本保持原样,需要成品就复制预览结果。注意替换同样受 g 修饰符影响,不勾 g 只会替换第一处。
提示「正则无效」是什么原因?
常见有三类:圆括号或方括号没有配对、量词位置不对(例如表达式以星号或加号开头)、反斜杠转义写得不完整。提示里会附上浏览器给出的原始错误说明,照着定位很快。另外要注意表达式框里不需要写两侧的斜杠和修饰符,斜杠已经画在输入框两边,修饰符请用旁边的勾选框选择,把 /abc/gi 整个贴进去反而会匹配不到。
匹配变得很慢甚至页面卡住怎么办?
某些表达式在特定输入下会触发灾难性回溯,典型形态是嵌套量词,也就是把一个本身可重复的分组再整体加上量词,然后后面接一个匹配不上的字符。由于匹配在主线程同步执行,这时页面会失去响应,只能关掉标签页重开。写规则时尽量避免嵌套量词,多用更精确的字符类,并先在几行短文本上验证,通过后再贴长文本。

文本分组的其它工具

  • 代码格式化在线 HTML / JS / CSS / SQL / JSON 代码格式化
  • JSONJSON 格式化、最小化、校验、字符串转义与 Unicode 处理
  • 文本处理大小写转换、命名风格、排序排重、信息提取
  • 文本对比左右对照逐行 diff,并高亮修改行内的字符级差异
  • MarkdownMarkdown 即时预览与 HTML 复制