正则表达式测试器

通过实时高亮显示和捕获组测试正则表达式。

数据不会离开您的设备

高亮匹配项

匹配详情

0 matches

快速参考

.除换行符外的任意字符 \d数字 (0-9) \w单词字符 (a-z, A-Z, 0-9, _) \s空白字符(空格、制表符、换行符) ^字符串开头(使用 m 标志时为行首) $字符串结尾(使用 m 标志时为行尾) *前一项出现 0 次或多次 +前一项出现 1 次或多次 ?前一项出现 0 次或 1 次 {n,m}前一项出现 n 到 m 次 [abc]字符类:a、b 或 c [^abc]非 a、b 或 c (abc)捕获组 (?:abc)非捕获组 a|ba 或 b \b单词边界 (?=abc)正向 lookahead (?!abc)负向 lookahead

关于正则表达式

正则表达式(regex)是用于匹配字符串中字符组合的模式。它们是编程、文本处理、数据验证和搜索操作中不可或缺的工具。每种主流编程语言都支持 regex · JavaScript、Python、Java、PHP、Ruby、Go 等。

本测试器使用 JavaScript 内置的 RegExp 引擎,支持 ECMAScript regex 语法,包括 lookahead、字符类、量词以及 g、i、m 和 s 标志。匹配项会在您输入时实时高亮显示,捕获组会显示在匹配详情面板中。

常见用途

常见问题

g、i、m 和 s 标志的作用是什么?

g(全局)查找所有匹配项,而不是在第一个匹配处停止。i(不区分大小写)忽略大小写区别。m(多行)使 ^ 和 $ 匹配每行的起始/结束位置。s(dotAll)使 . 也能匹配换行符。

这个 regex 能在 Python / Java / PHP 中使用吗?

大多数 regex 语法在各语言之间是通用的。但也存在差异 · 例如,JavaScript 并非在所有浏览器中都支持 lookbehind(现代浏览器支持),而 Python 使用不同的命名组语法。对于基础模式,在这里能用的在其他地方也能用。

我的测试数据会发送到任何地方吗?

不会。所有 regex 匹配都在您的浏览器中本地进行,使用的是 JavaScript 原生的 RegExp 引擎。不会向任何服务器发送任何数据。

什么是正则表达式测试器?

正则表达式测试器是一个交互式编辑器,它针对样本字符串运行正则表达式,并向您显示恰好匹配的内容、未匹配的内容以及捕获组包含的内容。测试器让您快速迭代:输入模式,查看高亮,调整,重复。它取代了编辑源代码、运行脚本和阅读控制台输出的缓慢循环。

正则表达式本身是 Stephen Cole Kleene 在 1956 年发明的一种描述字符串集合的模式语法。现代正则实现(PCRE、JavaScript 的 RegExp、Python 的 re、.NET 的 System.Text.RegularExpressions、Java 的 java.util.regex)共享其大部分语法,但在 lookbehind、命名组、Unicode 处理和量词行为等边缘情况上有所不同。

这个测试器使用您浏览器的原生 JavaScript RegExp 引擎,该引擎实现了 ECMAScript 2024 正则,包括所有标准标志(g、i、m、s、u、y、d)和现代 lookbehind。输出与您的前端代码在运行时看到的完全一致,这使得测试器在调试客户端验证、抓取选择器或 replace-with-callback 转换时特别有用。

测试器内部有什么

顶部行包含被正斜杠包围的模式输入,后跟四个最常用标志(g、i、m、s)的切换按钮。「Patterns」按钮打开常见正则代码片段(电子邮件、URL、电话、日期)的库,您可以点击它们来填充模式字段。在后台,输入被去抖动,因此重新输入不会拖累匹配器。

在模式下方,测试字符串文本区域是您粘贴样本文本的地方。匹配以黄色背景在「Highlighted Matches」面板中高亮显示,该面板会随着您的输入实时更新。「Replace with」字段接受带反向引用($1、$2 等)的替换字符串,并实时显示结果文本,非常适合在将其粘贴到代码中之前测试字符串替换转换。

「Match Details」列表显示每个匹配,带有其在源中基于零的索引、匹配的子字符串以及每个捕获组。底部的「Quick Reference」卡片回顾了字符类、量词、锚点和 lookaround 的语法,所以您无需为基础知识切换到文档选项卡。

历史和背景

Stephen Cole Kleene 定义正则事件(1956)

数学家 Stephen Cole Kleene 在 1956 年发表了论文《神经网络和有限自动机中事件的表示》,引入了他所称的「正则事件」:描述有限自动机接受的字符串集合的模式。Kleene 星号(* 操作符)以他的名字命名。他的代数表示法是今天所有正则语法的直接祖先。

Ken Thompson 推出 grep(1968)

贝尔实验室的 Ken Thompson 在 1968 年在 QED 编辑器中实现了正则引擎,并在 1973 年再次在 grep 中实现,grep 这个 Unix 工具的名称来自 QED 命令 g/regular-expression/p。Thompson 的基于 NFA 的引擎以每字符线性时间运行,这是回溯引擎后来在添加反向引用等功能时失去的保证。

Perl 5 引入扩展正则(1994)

Larry Wall 在 1994 年发布了 Perl 5,带有添加 lookahead、lookbehind、命名捕获(后来)、内联修饰符和反向引用的正则风味。Perl 5 正则变得如此占主导地位,以至于其他语言都复制了它的语法。Philip Hazel 在 1997 年创建了 PCRE(Perl Compatible Regular Expressions)作为 C 库,PCRE 今天在 PHP、Apache、NGINX 和许多其他工具中驱动正则。

JavaScript 推出 RegExp(1995,1999 年正式化)

Brendan Eich 的 JavaScript 1.0 在 1995 年推出,带有仿照 Perl 5 的 RegExp 对象。ECMAScript 第 3 版(1999)正式化了语法。后续版本添加了 Unicode 标志 u(ES2015)、sticky 标志 y(ES2015)、命名组(ES2018)、lookbehind(ES2018)和索引标志 d(ES2022)。浏览器随时间跟上,现代引擎(V8、SpiderMonkey、JavaScriptCore)实现了完整的 ES2024 规范。

ReDoS,正则表达式拒绝服务(2003 年起)

研究人员注意到,回溯正则引擎在某些输入上可能花费指数时间,这是一类称为 ReDoS(Regular expression Denial of Service)的漏洞。2019 年 Cloudflare 的一次中断追溯到了具有灾难性回溯的正则。rxxr 和 node-re2 等工具应运而生来检测或规避问题,引擎开始对长时间运行的匹配强制执行时间预算。

Unicode 属性转义进入 ECMAScript(2018)

ES2018 添加了 Unicode 属性转义,如 \p{Script=Latin} 或 \p{Letter},让您可以按 Unicode 类别匹配,而无需枚举码点。与 u 标志结合,正则现在可以区分表情符号与字母、各种文字之间的区别,并正确处理代理对。这使得 JavaScript 正则最终适合国际文本匹配,这是旧的仅 ASCII 语法无法解决的问题。

实用工作流

电子邮件验证

将有效和无效电子邮件的样本放入测试区域,输入您的候选正则(常见起点是 ^[^@\s]+@[^@\s]+\.[^@\s]+$),并调整直到有效电子邮件高亮显示而无效的不高亮。请注意,完整的 RFC 5321 电子邮件规范非常复杂,以至于完美的电子邮件正则有数百个字符。务实的正则捕获拼写错误;最终验证应通过实际的 SMTP 来回操作。

URL 解析和提取

粘贴一页 HTML 或纯文本,编写正则以提取 URL。像 https?:\/\/\S+ 这样的起始模式可捕获大多数情况。对于生产代码,请优先使用 URL 构造函数(new URL(string)),它处理每个边缘情况;正则最适合快速一次性提取或日志分析。

日志文件抓取

Apache 和 NGINX 日志遵循固定格式。粘贴几行日志,编写带命名捕获的正则((?\S+) (?\S+ \S+) "(?[^"]+)" ...),您就有了一个准备好提供给结构化日志分析器的解析器。在部署前在您的真实日志样本上测试。

代码编辑器中的查找和替换

VSCode、Sublime Text、JetBrains IDE 和 vim 都在它们的查找替换对话框中接受正则。先在此处迭代模式,带有实时高亮器显示恰好什么匹配,然后将正则粘贴到编辑器的对话框中。让自己免于在 5,000 行代码库上出错的痛苦。

Web 抓取 CSS 类名

当您需要在没有解析器(一次性脚本,不是生产)的情况下从 HTML 中提取数据时,像 class="([^"]+)" 这样的正则可以提取出 class 属性。对于超出快速探索的任何事情,请切换到适当的 DOM 库;HTML 不是正则语言,正则会错过边缘情况。

验证语义版本字符串

Semver 遵循 ^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$。将版本列表(1.0.0、1.2.3-beta.1+build.456)放入测试区域,检查正则是否正确捕获预发布和构建元数据。这在 CI 脚本中验证依赖项时很有用。

常见陷阱

贪婪 vs 懒惰量词

默认情况下,*、+ 和 ? 是贪婪的:它们尽可能多地匹配,然后如果正则的其余部分失败就回溯。懒惰版本 *?、+?、?? 尽可能少地匹配。经典示例是 text 上的 <.*>,它匹配整个字符串,而 <.*?> 只单独匹配 。选择正确的来避免过度匹配的惊喜。

灾难性回溯(ReDoS)

像 (a+)+ 或 (.*)* 这样的嵌套量词在长的非匹配输入上可能花费指数时间,因为引擎尝试每种组合。浏览器选项卡可能会冻结或崩溃。避免重叠的量词组,在支持的地方优先使用原子组 (?>...),或预先验证输入长度。npm 库 safe-regex 自动标记危险模式。

特殊字符需要转义

在正则中具有特殊含义的字符(. * + ? ^ $ ( ) [ ] { } | \)必须用反斜杠转义才能字面匹配。所以 \. 匹配点,而 . 匹配任意字符。忘记转义是验证 IP、文件扩展名或点分版本号时假阳性的最常见原因。

锚点和多行标志

如果没有 m 标志,^ 和 $ 只匹配整个字符串的开始和结束。带有 m,它们匹配每行的开始和结束。如果您的正则在单行上有效但在多行输入上失败,请切换 m。相反,如果它在多行输入上匹配太多,请删除 m。

跨引擎语法差异

这个测试器使用 JavaScript 正则。Python 的 re 对命名捕获使用 (?P) 而不是 (?),.NET 允许反向引用 \k 不同,PCRE 具有 JavaScript 缺少的递归子模式 (?R) 等功能。如果您的最终目标是 Python 或 Java,请在发布前也在这些引擎上验证。

没有 u 标志的 Unicode

如果没有 u 标志,JavaScript 正则将代理对(表情符号、CJK 补充)视为两个单独的代码单元。\u{1F600}(笑脸表情符号)在没有 u 的情况下不起作用。带有 u 标志,正则变得 Unicode 感知,像 \p{Letter} 这样的属性转义变得可用,代理对处理是正确的。匹配国际文本时始终设置 u。

隐私与数据处理

每个正则都由您浏览器的 RegExp 引擎编译和执行。我们不将您的模式、测试字符串或替换模板发送到任何服务器。匹配器在本地运行,高亮在本地呈现,匹配详细信息列表在本地计算。没有与您的输入内容相关的分析。

页面加载后,测试器可以离线工作。您可以断开网络连接,粘贴敏感的日志行或 PII,并对其运行模式,而不会有任何数据离开您的设备。这使得该工具对生产数据进行正则测试很安全,无需通过第三方服务发送。

什么时候不使用正则

解析 HTML 或 XML

HTML 不是正则语言。您不能用正则可靠地解析嵌套标签;关于 Zalgo 和 Cthulhu 的著名 Stack Overflow 答案生动地说明了这一点。请使用 DOMParser 或像 cheerio(Node.js)或 BeautifulSoup(Python)这样的库。正则对一次性提取很好,但在自闭合标签、注释、CDATA 和格式错误输入等边缘情况上会出问题。

任何真正递归的事物(JSON、源代码、数学表达式)

平衡的大括号、平衡的圆括号、嵌套函数调用、算术优先级,都需要上下文无关语法,而不是正则语法。使用解析器组合子(Parsimmon、nom)或生成器(pegjs、antlr)。正则可以匹配打开或关闭的标记,但不能跟踪平衡。

当简单的字符串操作就够了时

如果您需要检查字符串是否以 prefix- 开头,使用 str.startsWith("prefix-"),而不是 /^prefix-/。字符串方法更快、更清晰,并且不可能用量词出错。将正则保留给字符串方法无法表达的模式。

复杂的模式验证

验证 JSON 文档具有特定形状(必填字段、嵌套类型、值范围)用 JSON Schema 验证器(ajv、zod、joi)比用正则做得好得多。正则可以检查格式但不能检查结构,试图验证 JSON 文档的正则是一场维护噩梦。

更多问题

什么时候我应该使用 lookahead 与 lookbehind?

Lookahead (?=...) 断言后面的内容匹配而不消耗它;lookbehind (?<=...) 对前面的内容做同样的事情。当尾部上下文决定是否匹配时使用 lookahead,当前导上下文决定时使用 lookbehind。JavaScript 自 2018 年起(ES2018)支持两者,所有现代浏览器都支持。16.4 之前的旧 Safari 版本缺乏 lookbehind 支持。

所有浏览器都支持 lookbehind 吗?

Lookbehind(正向和负向)从 Chrome 62(2017)、Firefox 78(2020)、Edge 79(2020)和 Safari 16.4(2023)起得到支持。如果您的受众可能使用较旧的 Safari,请避免使用 lookbehind 或使用替代模式做 polyfill。对于 Node.js,自 10.0 起支持 lookbehind。

Unicode (u) 标志做什么?

u 标志启用 Unicode 模式:代理对被视为单个字符,\u{...} 转义工作,\p{...} 属性转义变得可用。如果没有 u,像笑脸这样的表情符号算作两个代码单元,. 只匹配前半部分。在处理 ASCII 之外的文本时始终设置 u。

正则引擎有多快?

V8 的 RegExp 引擎使用编译为本机代码的 Irregexp 实现。对于简单模式,它每秒匹配数百万字符。病态模式(对抗性输入上的嵌套量词)可能爆炸到指数时间,这就是为什么 ReDoS 是一个真正的攻击向量。现代引擎应用启发式算法检测和中止失控匹配,但您仍应避免有风险的模式。

JavaScript 和 Python 的正则有何不同?

命名组使用不同语法(JS 中的 ?,Python 中的 ?P)。Python 缺少 y(sticky)标志;JavaScript 缺少 Python 的详细模式。Python 通过第三方 regex 模块支持递归,但内置 re 不支持。字符类简写略有不同(\d 在两者中都意味着 [0-9],但 Python 中的 \w 在 Unicode 模式下包括下划线,而 JS 需要 u 标志才能有相同行为)。

我可以使用 AI 来生成正则吗?

LLM 善于提出初始正则模式,但经常产生微妙错误的输出(在需要懒惰时贪婪、缺少转义、错误的标志)。使用 AI 作为初稿,然后通过在此测试器中针对真实样本运行正则进行验证。迭代直到高亮恰好与您预期匹配。交互式反馈循环在 LLM 错误投入生产之前捕获它们。

相关工具