工具简介
PCRE 正则测试工具使用真正的 PCRE2 库来检查正则表达式在文本上的匹配情况,PHP、Perl 风格的工具和很多 Web 服务器用的都是这个引擎。匹配到的内容会被高亮,每处匹配都会列出位置和捕获组;填写替换内容后,还能预览类似 preg_replace 的替换结果。
之所以要用真实引擎来测试,是因为 PCRE 和 JavaScript 正则在一些细节上并不相同。一个在浏览器正则工具里能用的写法,放到 PHP 里可能编译失败,或者匹配到不同的内容。
使用方法
- 在 PCRE 正则 里输入不带分隔符的正则表达式。
- 把要搜索的文本粘贴到 测试文本。
- 打开需要的修饰符:g 查找全部匹配(相当于 preg_match_all),以及 i、m、s、x、U,还有让
\w、\d、\b支持 Unicode 的 u。 - 可以在 替换为 里填写替换内容来预览结果。用
$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 模块只下载一次,所有匹配都在浏览器本地运行。