DevToolPal
繁

PCRE 正規表示式測試

用真正的 PCRE2 引擎測試 PHP / Perl 相容正規表示式:支援遞迴、占有量詞、\K 等語法。

本機處理,不會上傳

選項

測試字串

0 字元 · 0 B

結果

結果會顯示在這裡

這個工具能做什麼

PCRE 正規表示式測試使用真正的 PCRE2 函式庫來比對你的文字,這也是 PHP、Perl 風格工具和許多網頁伺服器所用的引擎。符合的部分會被標示出來,每一處符合都會列出位置和擷取群組;選填的取代欄位則會顯示 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 會重設符合內容的起點,是後顧(lookbehind)的簡單替代方案。
  • 使用 (?R)、(?1) 或 (?&name) 的 遞迴 可以比對巢狀結構。
  • 行內修飾符 例如 (?i),可以只改變規則中某一部分的行為。

小提示

  • 在 PHP 中,要用 /.../ 或 ~...~ 這類分隔符號包住規則,並挑一個規則中沒有出現的字元,就不必另外跳脫。
  • 當文字含有重音字母或中日韓文字時,請開啟 u,讓 \w 也能比對到它們。

常見問題

› 這和 JavaScript 正規表示式測試有什麼不同?

這個頁面執行的是編譯成 WebAssembly 的 PCRE2,也就是 PHP 的 preg_ 函式、Nginx、Apache 和許多其他工具背後的引擎。它支援 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 模組只需下載一次,之後所有處理都在你的瀏覽器中執行。