版权所有 © 2007 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 解析器框架)处理。这些工具更强大,但灵活性较差。它们通常不允许您随意修改语法规则。此外,它们不具备正则表达式的穷尽回溯语义,这使得编写某些类型的模式更具挑战性。
xpressive 将这两种方法无缝地结合在一起,并在 C++ 文本处理领域占据了独特的地位。使用 xpressive,您可以选择像使用 Boost.Regex 一样使用它,将正则表达式表示为字符串。或者,您可以像使用 Spirit 一样使用它,将您的正则表达式编写为 C++ 表达式,享受专用于文本操作的嵌入式语言的所有好处。更重要的是,您可以将两者混合使用以获得两者的优势,编写正则表达式语法,其中一些正则表达式是静态绑定的——由编译器硬编码和语法检查——而另一些是动态绑定的并在运行时指定。这些正则表达式可以相互递归引用,匹配普通正则表达式无法匹配的字符串中的模式。
xpressive 接口的设计深受 John Maddock 的 Boost.Regex 库和他将正则表达式添加到标准库的 提案 的影响。我还从 Joel de Guzman 的 Spirit 解析器框架 中汲取了大量灵感,该框架是静态 xpressive 的模型。其他灵感来源是 Perl 6 重新设计和 GRETA。(您可以在此处阅读 Perl 6 将为正则表达式文化带来的更改摘要。)