Boost C++ 库

...世界上最受尊敬和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

第 43 章. 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