快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
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 提要和博客
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 版本。

本网站涵盖了从最新的 1.73 到 Boost 1.38、1.39 和 1.42。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。当我们比较 std::regex 的 Dinkumware 实现(包含在 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 所没有的 Perl 的任何功能。

下表重点介绍了 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 |