正则表达式工具 |
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 提要和博客 |
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 文档喜欢谈论与 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 标准。这实际上不是一个附加语法,而只是 ECMAScript 和 JavaScript 的同义词。实际的 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、PS | CR、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 |
页面网址:https://regexper.cn/boost.html
页面上次更新时间:2021 年 8 月 24 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。