Boost C++ 库

...世界上最受推崇和精心设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

第 45 章。Boost.Xpressive

Eric Niebler

根据 Boost 软件许可证 1.0 版分发。(请参阅随附的 LICENSE_1_0.txt 文件或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)

目录

前言
用户指南
简介
安装 xpressive
快速入门
创建正则表达式对象
匹配和搜索
访问结果
字符串替换
字符串分割和标记化
命名捕获
语法和嵌套匹配
语义动作和用户定义的断言
符号表和属性
本地化和正则表达式特征
技巧与诀窍
概念
示例
参考
头文件 <boost/xpressive/basic_regex.hpp>
头文件 <boost/xpressive/match_results.hpp>
头文件 <boost/xpressive/regex_actions.hpp>
头文件 <boost/xpressive/regex_algorithms.hpp>
头文件 <boost/xpressive/regex_compiler.hpp>
头文件 <boost/xpressive/regex_constants.hpp>
头文件 <boost/xpressive/regex_error.hpp>
头文件 <boost/xpressive/regex_iterator.hpp>
头文件 <boost/xpressive/regex_primitives.hpp>
头文件 <boost/xpressive/regex_token_iterator.hpp>
头文件 <boost/xpressive/regex_traits.hpp>
头文件 <boost/xpressive/sub_match.hpp>
头文件 <boost/xpressive/traits/c_regex_traits.hpp>
头文件 <boost/xpressive/traits/cpp_regex_traits.hpp>
头文件 <boost/xpressive/traits/null_regex_traits.hpp>
头文件 <boost/xpressive/xpressive.hpp>
头文件 <boost/xpressive/xpressive_dynamic.hpp>
头文件 <boost/xpressive/xpressive_fwd.hpp>
头文件 <boost/xpressive/xpressive_static.hpp>
头文件 <boost/xpressive/xpressive_typeof.hpp>
鸣谢
附录
附录 1:历史
附录 2:尚未实现
附录 3:与 Boost.Regex 的区别
附录 4:性能比较
附录 5:实现说明

妻子: 新的 Shimmer 是一种地板蜡!
丈夫: 不,新的 Shimmer 是一种甜点配料!
妻子: 它是一种地板蜡!
丈夫: 它是一种甜点配料!
妻子: 我告诉你,它是一种地板蜡!
丈夫: 它是一种甜点配料,你这个笨蛋!
播音员: 嘿,嘿,嘿,你们俩冷静点。新的 Shimmer 既是地板蜡也是一种甜点配料!

-- 周六夜现场

描述

xpressive 是一个高级的、面向对象的 C++ 正则表达式模板库。正则表达式可以写成在运行时解析的字符串,也可以写成在编译时解析的表达式模板。正则表达式可以相互引用,也可以递归地引用自身,允许您从中构建任意复杂的语法。

动机

如果您需要在 C++ 中操作文本,通常有两种不相关的选择:正则表达式引擎或解析器生成器。正则表达式引擎(如 Boost.Regex)强大而灵活;模式表示为可以在运行时指定的字符串。但是,这也意味着语法错误在运行时才会检测到。此外,正则表达式不太适合高级文本处理任务,例如匹配平衡的嵌套标签。这些任务传统上由解析器生成器处理(如 Spirit 解析器框架)。这些工具更强大但灵活性较差。它们通常不允许您动态地修改语法规则。此外,它们没有正则表达式的详尽回溯语义,这使得编写某些类型的模式更具挑战性。

xpressive 将这两种方法无缝地结合在一起,并在 C++ 文本处理领域占据了独特的地位。使用 xpressive,您可以像使用 Boost.Regex 一样使用它,将正则表达式表示为字符串。或者您可以像使用 Spirit 一样使用它,将您的正则表达式编写为 C++ 表达式,享受专门用于文本操作的嵌入式语言的所有好处。更重要的是,您可以混合这两种方法以获得两者的好处,编写正则表达式语法,其中一些正则表达式是静态绑定的——由编译器硬编码和语法检查,而另一些是动态绑定的并在运行时指定。这些正则表达式可以递归地相互引用,从而匹配普通正则表达式无法匹配的字符串模式。

影响和相关工作

xpressive 的接口设计受到了 John Maddock 的 Boost.Regex 库和他的将正则表达式添加到标准库的 提案 的强烈影响。我还从 Joel de Guzman 的 Spirit 解析器框架中汲取了大量灵感,该框架是静态 xpressive 的模型。其他灵感来源是 Perl 6 的重新设计和 GRETA。(您可以在这里阅读 Perl 6 将为正则表达式文化带来的变化的总结。)


PrevUpHomeNext