操作教程
如何无需安装任何软件就测试正则
你写好了一个模式,需要在把它放进代码之前确认它是否真的匹配你预期的内容。安装一个桌面工具,或者把私密日志粘贴到某个随机网站上,都太小题大做,而且往往有风险。本指南介绍如何在浏览器里直接用你自己的文本运行正则,切换那些改变行为的标志位,读取它提取出的捕获组,并看着匹配项内联高亮,而模式和文本始终不会离开你的标签页。
分步操作
- 打开正则测试器,在两条斜杠之间的输入框里输入你的模式。斜杠不用你自己写:工具会显示它们,让你看到引擎读取模式时的样子。把你的示例文本粘贴到下方的框里,比如几行日志、一份邮箱列表,或是你想搜索的一段代码。

- 在模式旁边的小框里设置标志位。g 标志会找出每一处匹配,而不是在第一处就停下;i 让匹配不区分大小写;m 让锚点 ^ 和 $ 匹配每一行的开头和结尾,而不是整段文本;s 让点号也能匹配换行符。可以自由组合,例如 gim。
- 按下测试。每一处匹配都会直接在你的文本中高亮显示,下方的列表会列出每一处匹配及其位置和各捕获组的值。调整模式后再次运行:预览会更新,于是你可以不断收窄模式,直到它恰好捕获你想要的内容、不多也不少。

捕获组:命名的与编号的
捕获组是你模式中用圆括号包裹的部分,它让你能从每处匹配中取出一小段,而不只是确认整体匹配成功。编号组按其左圆括号从左到右计数:在 (\d{4})-(\d{2})-(\d{2}) 中,组 1 是年,组 2 是月,组 3 是日。命名组使用 (?<name>...) 语法,因此当模式变长时,(?<year>\d{4}) 比一个光秃秃的编号好读得多。如果你只想分组而不捕获,比如要对几个字符施加量词,就用非捕获组 (?:...),这样它不会塞满你的结果列表。测试器会显示每处匹配中每个组的值,这是确认你正在提取正确片段的最快方式。
当模式卡死或行为异常时
有两个问题反复出现。第一个是灾难性回溯:像 (a+)+$ 这样的模式在一个长且不匹配的字符串上运行时,会让引擎尝试指数级数量的路径而卡死。测试器在带有短看门狗的 Web Worker 中运行每次测试,因此你得到的不是卡住的标签页,而是一条清晰的提示,可以据此简化模式,通常做法是在思路上让量词具占有性、给它加锚点,或避免嵌套重复。第二个是贪婪匹配与懒惰匹配:默认情况下 .* 会尽可能多地抓取,所以要匹配单个 HTML 标签的内容,你应该改用懒惰形式 .*?。如果你在比较一个字符串略有不同的两个版本,以弄清你的模式应该针对什么,文本对比工具会把它们对齐,让差异在你动手写表达式之前就一目了然。
浏览器如何评估你的正则表达式
现代浏览器内置了一个 ECMAScript 正则表达式引擎,支持完整的标志集:不区分大小写匹配(i)、多行模式(m)、dotAll(s)、Unicode(u)和粘性标志(y)。当你在测试工具中输入模式时,引擎将其编译为内部 NFA 并实时对你的测试字符串进行评估,报告每个匹配位置和任何捕获组。回溯在你的 CPU 上本地发生:像 `(a+)+` 这样的模式在长不匹配字符串上可能运行几秒钟,在浏览器中看到这种停顿是在生产代码中部署模式之前的有用反馈。没有文本离开页面,因此你可以粘贴日志样本或任何输入,而无需通过第三方服务器路由。
本指南用到的工具
常见问题
我的模式或测试文本会被发送到服务器吗?
不会。正则在你自己浏览器里的 Web Worker 中运行,所以模式和你用来测试的文本都留在标签页内。这一点很重要,因为你粘贴的文本往往是真实的日志、客户名单或内部配置,正是那种你不想放到别人服务器上的数据。在按下测试的同时打开开发者工具的网络面板,你会看到没有任何请求把你的文本带出去。页面加载之后,它在离线状态下也照样能用。
测试器使用哪种正则风格?
它使用你浏览器内置的 JavaScript 正则表达式引擎,也就是在 Node.js 和任何网页中运行的同一个引擎。它涵盖了常见语法:字符类、量词、锚点、分支、编号和命名捕获组、前瞻和后顾。其他风格的少数特性,比如 Perl 风格的递归或占有量词,并不属于 JavaScript 引擎,所以如果你从某个 PHP 或 Python 项目复制来的模式表现不同,通常就是这种风格差异所致。