正则表达式工具 |
grep |
语言和函数库 |
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 |
此网站上的更多信息 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
使用 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 标准的一部分。这实际上不是额外的语法,而只是 ECMAScript
和 JavaScript
的同义词。实际的 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、PS | CR、LF、LS、PS | LF |
对非参与群组的反向参考 | 符合空字符串 | 自 1.47 版起失败 | 符合空字符串 | 失败 |
空字符类别 | 无法符合 | 不可能 | 无法符合 | 不可能 |
自由间距模式 | 否 | 是 | 否 | 是 |
模式修改器 | 否 | 是 | 否 | 是 |
占有量词 | 否 | 是 | 否 | 是 |
命名捕获 | 否 | .NET 语法 | 否 | .NET 和 Python 语法 |
递归 | 否 | 原子 | 否 | 回溯 |
子常式 | 否 | 回溯 | 否 | 回溯 |
条件 | 否 | 是 | 否 | 是 |
原子组 | 否 | 是 | 否 | 是 |
原子组回溯捕获群组 | 不适用 | 否 | 不适用 | 是 |
前缀和后缀边界 | 否 | 是 | 否 | 否 |
标准 POSIX 类别 | 是 | 是 | 否 | 是 |
单字母 POSIX 类别 | 否 | 是 | 否 | 否 |
功能 | std::regex | Boost | JavaScript | Perl |