DevToolPal
简

PCRE 正则表达式测试

用真正的 PCRE2 引擎测试 PHP / Perl 兼容正则:支持递归、占有量词、\K 等 JavaScript 没有的语法。

本地处理,不上传

选项

测试文本

0 字符 · 0 B

结果

结果会显示在这里

工具简介

PCRE 正则测试工具使用真正的 PCRE2 库来检查正则表达式在文本上的匹配情况,PHP、Perl 风格的工具和很多 Web 服务器用的都是这个引擎。匹配到的内容会被高亮,每处匹配都会列出位置和捕获组;填写替换内容后,还能预览类似 preg_replace 的替换结果。

之所以要用真实引擎来测试,是因为 PCRE 和 JavaScript 正则在一些细节上并不相同。一个在浏览器正则工具里能用的写法,放到 PHP 里可能编译失败,或者匹配到不同的内容。

使用方法

  1. 在 PCRE 正则 里输入不带分隔符的正则表达式。
  2. 把要搜索的文本粘贴到 测试文本。
  3. 打开需要的修饰符:g 查找全部匹配(相当于 preg_match_all),以及 i、m、s、x、U,还有让 \w、\d、\b 支持 Unicode 的 u。
  4. 可以在 替换为 里填写替换内容来预览结果。用 $1 或 ${1} 引用编号分组,${name} 引用命名分组,$0 表示整个匹配。

正则写错时,工具会显示 PCRE2 自己的错误信息,以及它在正则中停下的位置。

示例

默认的正则 \((?:[^()]++|(?R))*\) 用来查找成对的括号:一对括号里面要么是非括号字符,要么递归地再次匹配整个正则。它在示例文本里找到了 (a, g(b, c)) 和 ((x), y),并忽略了末尾没有闭合的括号。这种写法是 JavaScript 正则做不到的。

也可以试试 (?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR),替换为 ${cur} $1,就能把第二行里的金额和货币代码对调。

值得了解的 PCRE 特性

  • 占有量词(*+、++、?+)和 原子组((?>...))一旦匹配就不会回退,可以避免失控的回溯。
  • \K 会重置匹配的起点,是后行断言的简便替代写法。
  • 用 (?R)、(?1) 或 (?&name) 进行 递归,可以匹配嵌套结构。
  • (?i) 这样的 行内修饰符 可以只对正则的一部分生效。

小技巧

  • 在 PHP 里使用时,要给正则加上 /.../ 或 ~...~ 这样的分隔符,并选一个正则里没有出现的字符,这样就不用再转义它。
  • 文本里有带重音的字母或中日韩文字时,记得打开 u,这样 \w 才能匹配它们。

常见问题

› 和 JavaScript 正则测试工具有什么区别?

这个页面运行的是 PCRE2,也就是 PHP 的 preg_ 系列函数、Nginx、Apache 等众多工具使用的正则引擎,编译成了 WebAssembly。它支持很多 JavaScript 没有的语法,例如用 (?R) 递归、a++ 这样的占有量词、原子组、\K、(?P<name>...) 命名分组,以及 x 和 U 修饰符。

› 需要输入 /pattern/i 这样的分隔符吗?

不需要。只输入正则本身,修饰符用开关打开即可。PHP 里的 `preg_match('/\d+/i', $s)` 对应的就是正则 `\d+` 加上“忽略大小写”。

› 为什么会出现“match limit exceeded”?

有些正则(比如在一个不匹配的长字符串上运行 ^(a+)+$)会产生指数级的回溯。为了让页面保持响应,测试工具在五百万步后会停止。PHP 也有类似的保护设置 pcre.backtrack_limit,触发时 preg_match 会返回 false。

› 我的文本会被上传吗?

不会。PCRE2 的 WebAssembly 模块只下载一次,所有匹配都在浏览器本地运行。