快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
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 Boost developers!

使用 Boost 的 C++ 正規表示式

Boost 是 C++ 的免費原始碼函式庫。在下載並解壓縮後,您需要執行 bootstrap 批次檔或指令碼,然後執行 b2 --with-regex 來編譯 Boost 的正規表示式函式庫。接著將您解壓縮 Boost 的資料夾新增至 C++ 編譯器的包含路徑中。將該資料夾的 stage\lib 子資料夾新增至連結器的函式庫路徑中。然後您可以在 C++ 程式碼中新增 #include <boost/regex.hpp> 來使用 Boost 正規表示式。

如果您使用 C++Builder,您應該從 Embarcadero 下載適用於您特定 C++Builder 版本的 Boost 函式庫。您取得的 Boost 版本取決於您的 C++Builder 版本,以及您鎖定的目標是 Win32 還是 Win64。XE3 到 XE8 中的 Win32 編譯器,以及 C++Builder 10 Seattle 到 10.1 Berlin 中的傳統 Win32 編譯器都停留在 Boost 1.39。XE3 到 XE6 中的 Win64 編譯器使用 Boost 1.50。XE7 到 10.1 Berlin 中的 Win64 編譯器使用 Boost 1.55。C++Builder 10 及更新版本中的新 C++11 Win32 編譯器使用與 Win64 編譯器相同的 Boost 版本。

本網站涵蓋 Boost 1.38、1.39 和 1.42 到最新的 1.73。Boost 1.40 引進許多新的正規表示式功能,這些功能取自 Perl 5.10。但它也引進了一些嚴重的錯誤,直到 Boost 1.42 才修正。因此我們完全忽略 Boost 1.40 和 1.41。我們仍涵蓋 Boost 1.38 和 1.39(它們具有相同的正規表示式功能),因為傳統的 Win32 C++Builder 編譯器停留在這個版本。如果您使用其他編譯器,您絕對應該使用 Boost 1.42 或更新版本,以避免現在已成為舊錯誤的問題。您最好使用 Boost 1.47 或更新版本,因為這個版本會變更涉及反向參照的特定行為,如果您稍後從 1.47 之前的版本升級到 1.47 之後的版本,可能會變更部分正規表示式的行為。

在實務上,您大多會使用 Boost 的 ECMAScript 語法。它是預設語法,提供的功能遠多於其他語法。每當本網站上的教學提到 Boost 但未提到任何語法時,寫下的內容就適用於 ECMAScript 語法,可能適用或不適用於任何其他語法。您實際上只會在想要重複使用舊 POSIX 程式碼或 UNIX 指令碼中的現有正規表示式時使用其他語法。

Boost 和正規表示式標準

Boost 文件喜歡談論與 Perl 和 JavaScript 相容,以及 boost::regex 如何在 C++11 中標準化為 std::regex。當我們將 Dinkumware 實作的 std::regex(包含在 Visual Studio 和 C++Builder 中)與 boost::regex 相比較時,我們發現類別和函式範本幾乎相同。您的 C++ 編譯器會很樂意編譯使用 boost::regex 的程式碼,就像編譯使用 std::regex 的相同程式碼一樣。因此,本網站上 std::regex 主題 中提供的範例程式碼,如果將 std 替換為 boost,就能順利與 Boost 搭配使用。

但是當您執行 C++ 應用程式時,Dinkumware 或 Boost 詮釋您的正規表示式會產生很大的差異。儘管兩者都提供相同的 六種語法,但這兩個函式庫的語法和行為並不相同。Boost 定義了 regex_constants::perl,這不是 C++11 標準的一部分。這實際上不是額外的語法,而只是 ECMAScriptJavaScript 的同義詞。實際的 JavaScript 和實際的 Perl 所使用的正規表示式類型有很大的不同。因此,很明顯地,將這些視為一種類型或語法的函式庫無法與任何一種相容。Boost 的 ECMAScript 語法是實際的 JavaScript 和 Perl 類型的交叉,並加入了一堆 Boost 特有的功能和特性。Dinkumware 的 ECMAScript 語法較接近實際的 JavaScript,但仍有顯著的行為差異。Dinkumware 沒有從 JavaScript 沒有的功能中借用任何功能。

下表重點說明了 std::regex 和 Boost 中的 ECMAScript 語法與實際的 JavaScript 和 Perl 之間最重要的差異。有些是功能集的明顯差異。但其他則是行為上的細微差異,可能會出乎意料地影響您。

功能 std::regex Boost JavaScript Perl
點符號符合換行符號 從未 預設 從未 選項
錨點符合換行符號 始終 預設 選項 選項
換行符號 CR、LF CR、LF、FF、NEL、LS、PSCR、LF、LS、PS LF
對非參與群組的反向參考符合空字串自 1.47 版起失敗符合空字串失敗
空字元類別 無法符合 不可能無法符合 不可能
自由間距模式
模式修改器
佔有量詞
命名捕獲 .NET 語法 .NET 和 Python 語法
遞迴 原子 回溯
子常式 回溯 回溯
條件
原子群組
原子群組回溯捕獲群組不適用 不適用
字首和字尾邊界
標準 POSIX 類別
單字母 POSIX 類別
功能 std::regex Boost JavaScript Perl

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

| 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 |