Boost C++ 库

...世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

第 43 章。 Boost.Xpressive - Boost C++ 函数库
PrevUpHomeNext

第 43 章。 Boost.Xpressive

Eric Niebler

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

妻子: 新的 Shimmer 是地板蜡!
丈夫: 不,新的 Shimmer 是甜点配料!
妻子: 它是地板蜡!
丈夫: 它是甜点配料!
妻子: 我告诉你,它是地板蜡!
丈夫: 你这个母牛,它是甜点配料!
主持人: 嘿,嘿,嘿,两位都冷静点。新的 Shimmer 既是地板蜡 也是 甜点配料!

——《周六夜现场》

描述

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

动机

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

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

影响和相关工作

xpressive 接口的设计深受 John Maddock 的 Boost.Regex 库及其将正则表达式添加到标准库的 提案 的影响。我也从 Joel de Guzman 的 Spirit Parser Framework 中获得了许多灵感,它为静态 xpressive 提供了模型。其他灵感来源包括 Perl 6 的重新设计和 GRETA。(您可以在 此处 阅读 Perl 6 将为正则表达式文化带来的变化的摘要。)


PrevUpHomeNext