正则测试器

/ /

键入一个正则表达式,粘贴要测试的文本,测试器就会运行该模式并列出它找到的每个匹配。每个结果都显示匹配从哪里开始,以及每个捕获组的内容,让你清楚看到模式究竟捕获了什么。切换不区分大小写、多行和 dotall 标志,即可改变模式的行为。

如何测试正则

  1. 1

    输入你的模式

    键入不带定界符的表达式;测试器会为你用 `/ /` 包裹。无效的模式会显示清晰的错误信息,而不是无声失败。

  2. 2

    选择标志

    开启 `i`(不区分大小写)、`m`(多行)或 `s`(dotall),以按你需要的方式匹配。

  3. 3

    粘贴测试文本

    添加你想搜索的文本。测试器会遍历全部内容,找出每一个匹配,而不仅仅是第一个。

  4. 4

    检查匹配

    每个匹配都会显示它在文本中的位置(offset)、完整匹配,以及每个带编号的捕获组。

测试器会向你展示什么

在脑中或用一条快速的 grep 运行模式,只能告诉你是否匹配。测试器还会展示:

  • 每个匹配及其位置。 它总是搜索整段文本,并用匹配开始处的字符偏移量报告每个匹配。
  • 哪个组捕获了什么。 每个匹配都会拆分为完整匹配和带编号的捕获组,让你确认某个 (...) 抓到的正是你期望的部分。
  • 标志改变了什么。 开启 ims 并重新测试,看看不区分大小写、多行或 dotall 如何改变结果。

标志一览

标志 名称 改变什么
i 不区分大小写 A 也匹配 a,反之亦然
m 多行 ^$ 在每一行的开头和结尾匹配,而不只是整段文本
s Dotall . 也匹配换行符

匹配始终是全局的:测试器返回文本中的每个匹配,因此无需另设“global”标志。模式在带 Unicode 支持的 PCRE 引擎上运行,所以像 \w\d 这样的字符类在国际化文本上表现一致。

这能帮你发现的常见正则问题

症状 常见原因
一个覆盖一切的巨大匹配 .* 是贪婪的;改用 .*? 或像 [^"]* 这样的否定字符类
^$ 只匹配一次 多行文本上缺少 m 标志
. 在换行处停止 缺少 s 标志
捕获组顺序出乎意料 嵌套的 ( 会改变组的编号;从左到右数一数
模式运行缓慢 在重叠的分支上嵌套 *+ 会导致大量回溯

让模式更快更稳的技巧

  • 当匹配从开头开始时,用 ^ 加锚点,让引擎不必扫描整个字符串。
  • 优先使用字符类([abc])而非分支(a|b|c);在每个主流引擎中字符类都更快。
  • 当你知道终止符时,用像 [^"]* 这样的否定字符类替换贪婪的 .*,就不会有回溯。

常见问题

它用 PCRE 运行你的模式,这是 PHP 内置的引擎,并开启了 Unicode 模式。PCRE 特有的语法,如 \d\b 和环视,都能按预期工作。如果你打算在 JavaScript、Python 或其他语言中部署该模式,请在上线前检查一些细小的语法差异。

每个匹配。测试器总是搜索整段文本,因此无需另设“global”标志。每个匹配都会连同它在文本中的位置一起列出。

能。每个匹配都会拆分为完整匹配和每个带编号的捕获组,让你确认每个 (...) 捕获了文本的哪一部分。

i 让匹配不区分大小写,m^$ 在每个行边界匹配,s. 也能匹配换行符。开启或关闭它们并重新测试,以比较结果。

测试器会显示一条清晰的错误信息来描述问题,例如未闭合的方括号或未结束的分组,而不是无声地返回零匹配。

相关工具

此工具还提供其他语言版本