我很好奇使用不同的正则表达式引擎代替默认 Perl 引擎的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的 OO/过程接口(interface)。我想知道这是为什么。
我见过一些用 PCRE (re::engine::PCRE)、TRE (re::engine::TRE) 或 RE2 (re::engine::RE2) 替换 Perl 正则表达式引擎的模块在给定的词汇上下文中。我找不到任何面向对象的模块来创建/编译使用不同后端的正则表达式。我很好奇为什么有人会选择将此功能作为编译指示而不是作为更典型的模块来实现。看起来替换 perl 正则表达式引擎比制作一个公开 PCRE、TRE 和 RE2 已经提供的 API 的 XS 脚本要困难得多(取决于它公开的 API 的复杂性)。
最佳答案
I'm curious about...why the modules I've seen are pragmas and not a more traditional OO/procedural interface.
可能是因为 Perl 正则表达式 API,记录在perldoc perlreapi
中自 5.9.5 起可用,让您可以利用 Perl 的解析器,它只需很少的代码即可为您提供许多很酷的功能。
如果您使用 API,您将:
- 不必实现您自己的
split
版本和替换运算符s///
- 不必编写自己的代码来解析正则表达式修饰符(
msixpn
作为标志传递给您的实现的回调函数) - 可以利用优化,例如常量正则表达式仅编译一次(在编译时),以及包含插值变量的正则表达式仅在变量更改时才编译
- 可以在程序中使用
qr
来引用正则表达式并轻松地将它们插入到其他正则表达式中 - 可以轻松设置编号和命名的捕获变量,例如
$1
,$+{foo}
- 不要强制引擎的用户重写所有代码才能使用您的 API;他们可以简单地添加一个编译指示
我可能错过了更多。关键是,您可以通过 API 获得大量免费代码和免费功能。如果你看看 re::engine::PCRE
的实现,例如,它实际上相当短(< 400 行 XS 代码)。
替代方案
如果您只是在寻找一种更简单的方法来实现您自己的正则表达式引擎,请查看 re::engine::Plugin
,它允许您使用 Perl 而不是 C/XS 编写实现。请注意,有一长串 caveats ,包括不支持 split
和 s///
。
或者,您可以使用重载常量来扩展内置引擎,而不是实现完全自定义的引擎,如 perldoc perlre
中所述。 。这只适用于常量正则表达式;在将变量插入正则表达式之前,您必须显式转换变量。
关于regex - 为什么要实现不同的正则表达式引擎(例如 PCRE)作为编译指示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632869/