快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和程式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多內容
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for PCRE users!

PCRE 開放原始碼正規表示式程式庫

PCRE 是 Perl 相容正規表示式的簡稱。這是由 Philip Hazel 以 C 語言編寫的開放原始碼程式庫名稱。此程式庫與大量的 C 編譯器和作業系統相容。許多人已從 PCRE 衍生出程式庫,使其與其他程式語言相容。包含在 PHP(7.3.0 之前)、DelphiR(4.0.0 之前)以及 Xojo (REALbasic) 中的正規表示式功能皆以 PCRE 為基礎。此程式庫也包含在許多 Linux 發行版中,作為共享的 .so 程式庫和 .h 標頭檔。

儘管 PCRE 自稱與 Perl 相容,但 Perl 和 PCRE 的當代版本之間的差異已足夠多,可以將它們視為不同的正規表示式風格。Perl 的最新版本甚至複製了 PCRE 從其他程式語言複製而來(在 Perl 擁有這些功能之前)的功能,試圖讓 Perl 更相容於 PCRE。現今 PCRE 的使用比 Perl 更廣泛,因為 PCRE 是許多程式庫和應用程式的一部分。

Philip Hazel 最近發布了一個名為 PCRE2 的新函式庫。第一個 PCRE2 發行版給予版本號碼 10.00,以與先前的 PCRE 8.36 明確區隔。未來的 PCRE 發行版將僅限於錯誤修正。新功能將僅放入 PCRE2。如果您要進行新的開發專案,您應該考慮使用 PCRE2,而不是 PCRE。但對於已經使用 PCRE 的現有專案,最好還是堅持使用 PCRE。從 PCRE 移轉到 PCRE2 需要對您的原始碼進行重大變更(但不需要對您的正規表示式進行變更)。

您可以在 https://www.pcre.org/ 找到有關 PCRE 和 PCRE2 的更多資訊。

使用 PCRE

使用 PCRE 非常簡單。在您使用正規表示式之前,需要將其轉換為二進位格式以提高效率。為此,只需呼叫 pcre_compile(),並將您的正規表示式傳遞為 null 終止字串。該函式會傳回指向二進位格式的指標。您無法對結果執行任何操作,只能將其傳遞給其他 pcre 函式。

若要使用正規表示式,請呼叫 pcre_exec(),並傳遞 pcre_compile() 傳回的指標、您想要搜尋的字元陣列,以及陣列中的字元數(不需要 null 終止)。您還需要傳遞一個指標到整數陣列,其中 pcre_exec() 會儲存結果,以及以整數表示的陣列長度。陣列長度應等於您想要支援的 擷取群組 數量,加上一(表示整個正規表示式比對),乘以三 (!)。如果找不到比對,該函式會傳回 -1。否則,它會傳回已填入的擷取群組數量加上一。如果陣列中容納的群組多於可容納的群組,它會傳回 0。陣列中包含結果的前兩個整數分別包含正規表示式比對的開始位置(從陣列開始處計算位元組)和正規表示式比對中的位元組數。後面的整數對包含反向參照的開始位置和長度。因此,array[n*2] 是擷取群組 n 的開始位置,而 array[n*2+1] 是擷取群組 n 的長度,其中擷取群組 0 是整個正規表示式比對。

當您完成正規表示式時,請使用 pcre_compile() 傳回的指標呼叫 pcre_dispose(),以防止記憶體外洩。

原始 PCRE 函式庫僅支援正規表示式比對,這項工作做得相當好。它不支援搜尋和取代、字串分割等功能。這可能看起來不是什麼大問題,因為您可以在自己的程式碼中輕鬆執行這些操作。然而,不幸的後果是,所有使用 PCRE 進行正規表示式比對的程式語言和函式庫在分割字串時都有自己的取代文字語法和自己的特殊用法。新的 PCRE2 函式庫支援搜尋和取代。

編譯支援 Unicode 的 PCRE

預設情況下,PCRE 會在沒有 Unicode 支援的情況下編譯。如果您嘗試在正規表示式中使用 \p\P\X,PCRE 會抱怨它是在沒有 Unicode 支援的情況下編譯的。

若要使用 Unicode 支援編譯 PCRE,您需要定義 SUPPORT_UTF8 和 SUPPORT_UCP 條件定義。如果 PCRE 的設定指令碼在您的系統上執行,您可以在執行 make 之前執行 ./configure --enable-unicode-properties 來輕鬆執行此操作。本網站上的 正規表示式教學 假設您已使用這些選項編譯 PCRE,且所有其他選項都設定為其預設值。

PCRE 呼叫

PCRE 獨有的功能是「呼叫」。如果您在正規表示式中的任何位置放置 (?C1)(?C255),PCRE 會在比對嘗試期間到達呼叫時呼叫 pcre_callout 函式。

UTF-8、UTF-16 和 UTF-32

預設情況下,PCRE 使用 8 位元組字串,其中每個字元為一個位元組。您可以將 PCRE_UTF8 傳遞為 pcre_compile() 的第二個參數(可能與其他風格結合使用二進位或),以告知 PCRE 將您的正規表示式解釋為 UTF-8 字串。當您執行此操作時,pcre_match() 也會自動使用 UTF-8 來解釋主旨字串。

如果您有 PCRE 8.30 或更新版本,您可以透過在執行 make 之前將 --enable-pcre16 傳遞給 configure 指令碼來啟用 UTF-16 支援。然後,如果您正規表示式和主旨字串儲存為 UTF-16,您可以將 PCRE_UTF16 傳遞給 pcre16_compile(),然後使用 pcre16_match() 進行比對。UTF-16 對 U+FFFF 以下的碼點使用兩個位元組,對較高的碼點使用四個位元組。在 Visual C++ 中,wchar_t 字串使用 UTF-16。請務必確保您沒有混用 pcre_ 和 pcre16_ 函式。PCRE_UTF8 和 PCRE_UTF16 常數實際上是相同的。您需要使用 pcre16_ 函式來取得 UTF-16 版本。

如果您有 PCRE 8.32 或更新版本,您可以透過在執行 make 之前將 --enable-pcre32 傳遞給 configure 指令碼來啟用 UTF-16 支援。然後,如果您正規表示式和主旨字串儲存為 UTF-32,您可以將 PCRE_UTF32 傳遞給 pcre32_compile(),然後使用 pcre32_match() 進行比對。UTF-32 每個字元使用四個位元組,在 Linux 上的記憶體內 Unicode 字串中很常見。請務必確保您沒有將 pcre32_ 函式與 pcre16_ 或 pcre_ 組合使用。同樣地,PCRE_UTF8 和 PCRE_UTF32 常數是相同的。您需要使用 pcre32_ 函式來取得 UTF-32 版本。

| 快速開始 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |