regex - 为什么要实现不同的正则表达式引擎(例如 PCRE)作为编译指示?

标签 regex perl pcre re2

我很好奇使用不同的正则表达式引擎代替默认 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 ,包括不支持 splits///

或者,您可以使用重载常量来扩展内置引擎,而不是实现完全自定义的引擎,如 perldoc perlre 中所述。 。这只适用于常量正则表达式;在将变量插入正则表达式之前,您必须显式转换变量。

关于regex - 为什么要实现不同的正则表达式引擎(例如 PCRE)作为编译指示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632869/

相关文章:

javascript - 不接受 0-0-0 的正则表达式是什么?

perl - 在打印函数中调用子程序

linux - perl脚本中的chown命令用法

perl - 如何在 Ubuntu 14.04 上安装 Perl 5.10.1?

c++ - 如何让 PCRE 与 C++ 一起工作?

javascript - 如何在 Javascript 上使用 RegEx 从字符串中获取范围值

JavaScript 正则表达式(字符串应仅包含字母、空格、连字符)

javascript - 正则表达式匹配包含固定数量逗号的句子

java -\G 在 PCRE 后视中如何工作

php - 如何匹配不包含某些子字符串的字符串组