PixConvert

免费在线正则表达式测试器与调试器

直接在浏览器中构建和调试正则表达式,享受即时语法高亮和捕获组详细解析。

//
Examples:

如何测试正则表达式

1

输入你的模式。

在两个斜杠之间输入正则表达式,不要带上斜杠本身。用 g、i、m、s 按钮选择标志,或加载三个示例之一。

2

粘贴你的测试文本。

把示例文本放进模式下方的文本框。输入时匹配会即时高亮,数量会显示模式找到了多少个匹配。

3

检查分组并复制。

查看每个匹配列出的捕获组。模式没问题后,将其以 /pattern/flags 的形式复制,并粘贴到你的 JavaScript 代码中。

常见问题

关于 JavaScript 正则引擎、标志和分组的解答。

如何在线测试正则表达式?

在顶部文本框中输入模式(不带斜杠),然后在下方粘贴示例文本。输入时匹配会即时高亮,匹配数量也会更新。开启 g 可查看所有匹配,而不只是第一个。

这个测试器使用哪种正则风格?

它使用 JavaScript 内置的 RegExp 引擎,也就是你的浏览器运行的 ECMAScript 风格。在这里能匹配的模式,在 JavaScript 和 TypeScript 代码中也会以同样方式匹配。PCRE、Python 和 Java 的语法可能不同,请在各自的引擎中测试这些模式。

为什么我的正则在 Python 或 PHP 中可用,在这里却不行?

JavaScript 不支持部分 PCRE 和 Python 语法。像 a++ 这样的占有量词、原子组、内联的 (?i) 标志以及 Python 的 (?P...) 命名分组,都会报 Nothing to repeat 或 Invalid group。\K 会被当作普通的 K。请用 JavaScript 语法重写这些部分。

g、i、m、s 标志分别有什么作用?

g 标志会找出所有匹配,而不是在第一个就停下。i 标志忽略大小写。开启 m 后,^ 和 $ 锚点会在每一行匹配。开启 s 后,点号也能匹配换行符。只有 g 默认开启。

支持 u、y 或 d 标志吗?

不支持。只能开启 g、i、m 和 s。没有 u 时,Unicode 属性转义无法使用,一个 emoji 会被算作两个字符,因此点号只会匹配到它的一半。含大量 Unicode 的模式,目前请在你自己的代码中测试。

如何使用命名捕获组?

在左括号后紧跟一个问号和用尖括号括起来的名称,就像内置的 word 示例那样。之后每个匹配都会按名称列出该分组,例如 word: longer。如果一个模式同时包含命名和未命名分组,则只会列出命名分组。

为什么我的模式会显示空匹配?

像 a* 或 \d* 这类可以匹配空内容的模式,在每个不符合的位置也会匹配到一个空字符串。对文本 bbb,a* 会得到 4 个空匹配。如果至少需要一个字符,请用 + 代替 *。

为什么 ^ 只匹配第一行?

没有 m 标志时,^ 和 $ 表示整段文本的开头和结尾。开启 m 后,它们会在每个换行处匹配,因此像 ^\w+ 这样的模式会找到每一行的第一个单词,而不只是第一行。

为什么某些模式会让页面卡死?

像 (a+)+$ 这样的嵌套量词会引发灾难性回溯,而且测试器没有时间限制。在对同一段代码的 Node 测试中,27 个字母大约耗时 2 秒,每多一个字母耗时就翻一倍。请收窄内部分组;如果标签页卡住,请重新加载。

可以用这个正则表达式测试器替换文本吗?

不可以,目前还没有替换模式。测试器只显示匹配和捕获组。若要规划替换,请先确认每个分组捕获的部分正确,然后在你自己代码的 String.replace 中以 $1 的形式使用它。

我测试的文本会被发送到别处吗?

测试文本不会被发送,匹配在你的浏览器中运行。在线网站上,Google Analytics 会记录每次匹配运行及其耗时。对于无效的模式,它还会收到错误信息,而在 Chrome 中该信息包含模式本身。

适用于 JavaScript 模式的正则表达式测试器功能

你的模式运行在浏览器自带的 JavaScript RegExp 引擎上,因此在这里能匹配的模式,在你的 JS 代码中也会以同样方式匹配。

正则表达式测试器,模式为 \d{4}-\d{2}-\d{2},已开启 g 标志,日志行中高亮显示 3 个日期

输入时即时高亮正则匹配

测试文本中的每个匹配都会用颜色标出,上方的匹配数量也会随每次修改更新。开启 g 时可看到所有匹配;关闭时只显示第一个。

  • 每次按键都会重新计算
  • g 标志会找出所有匹配
  • 匹配数量显示在文本上方
立即试用
(?<year>\d{4})-(?<month>\d{2}) 的正则表达式测试器捕获组:year 为 2024,month 分别为 01、01 和 02

查看每个匹配的捕获组

高亮区域下方,每个匹配都有独立的一行来显示其分组。命名分组按名称显示,例如 word: longer;未命名分组则显示为 Group 1、Group 2,依此类推。

  • 命名分组按名称列出
  • 未匹配到内容的分组显示短横线
  • 每个匹配占一行
立即试用

四个标志,各一键切换

模式旁边的按钮可切换全局 (g)、忽略大小写 (i)、多行 (m) 和 dotAll (s)。g 标志默认开启。目前还不支持 u、y 或 d 标志。

了解模式失败的原因

无效的模式会在红色方框中显示引擎自身的提示,例如 Unterminated group 或 Nothing to repeat。修正模式后,匹配结果就会恢复。

从示例开始

一键加载三个示例模式:电子邮件地址、2024-01-15 这样的 ISO 日期,以及用于匹配五个及以上字母单词的命名分组。复制会将模式以 /pattern/flags 的形式放入你的剪贴板。

你的测试文本留在设备上

匹配在你的设备上运行,你测试的文本绝不会被发送。使用统计会记录匹配耗时,对于无效的模式还会记录错误信息,其中可能包含该模式。

常见正则使用场景

三个日常场景,先测试正则可以避免日后出错。

表单验证

在把邮箱、电话或邮编模式放进表单之前,先用真实样本检查它。把合格和不合格的输入分行粘贴,看看哪些能匹配。

  • 粘贴有效和无效的输入,每行一个
  • 开启 m,让锚点按行匹配
  • 确认模式会拒绝每一个不合格样本

日志解析

从日志行中提取字段,例如 IP 地址、时间戳和状态码。从日志文件中粘贴几行,用分组捕获每个部分。

  • 用编号分组捕获 IP 地址
  • 匹配 2024-01-15 这样的 ISO 日期
  • 为每个分组命名,让每个字段都有标签

替换前先搜索文本

在代码中编写替换步骤之前,先找出一段文本里的所有 URL、话题标签或重复单词。匹配数量会告诉你预期有多少处命中。

  • 在粘贴的文本中查找 URL 和电子邮件地址
  • 用反向引用找出重复的字母或单词
  • 批量替换前先检查匹配数量