Regex 为什么要将不同的正则表达式引擎(如PCRE)作为pragma实现?

Regex 为什么要将不同的正则表达式引擎(如PCRE)作为pragma实现?,regex,perl,pcre,re2,Regex,Perl,Pcre,Re2,我很好奇使用不同的正则表达式引擎代替默认的Perl引擎的最佳实践,以及为什么我看到的模块是pragmas而不是更传统的OO/过程接口。我想知道这是为什么 在给定的词法上下文中,我看到了一些用PCRE(re::engine::PCRE)、TRE(re::engine::TRE)或RE2(re::engine::RE2)替换Perl regex引擎的模块。我找不到任何用于创建/编译使用不同后端的正则表达式的面向对象模块。我很好奇为什么有人会选择将此功能实现为一个pragma,而不是一个更典型的模块。

我很好奇使用不同的正则表达式引擎代替默认的Perl引擎的最佳实践,以及为什么我看到的模块是pragmas而不是更传统的OO/过程接口。我想知道这是为什么

在给定的词法上下文中,我看到了一些用PCRE(re::engine::PCRE)、TRE(re::engine::TRE)或RE2(re::engine::RE2)替换Perl regex引擎的模块。我找不到任何用于创建/编译使用不同后端的正则表达式的面向对象模块。我很好奇为什么有人会选择将此功能实现为一个pragma,而不是一个更典型的模块。似乎替换perl正则表达式引擎要比生成一个XS脚本来公开PCRE、TRE和RE2已经提供的API困难得多(取决于它所公开的API的复杂性)

我很好奇…为什么我看到的模块是pragmas而不是更传统的OO/过程接口

可能是因为Perl regex API(在5.9.5中有文档记录并在5.9.5中提供)让您可以利用Perl的解析器,它用很少的代码提供了很多很酷的特性

如果您使用API,您将:

  • 不必实现您自己版本的
    split
    和替换操作符
    s///
  • 不必编写自己的代码来解析正则表达式修饰符(
    msixpn
    作为标志传递给实现的回调函数)
  • 可以利用优化,比如只编译一次常量正则表达式(在编译时),以及只在变量更改时编译包含插值变量的正则表达式
  • 可以在程序中使用
    qr
    引用正则表达式,并轻松地将其插入其他正则表达式中
  • 可以轻松设置编号和命名的捕获变量,例如
    $1
    $+{foo}
  • 不要强迫引擎的用户重写所有代码以使用API;他们可以简单地添加一个pragma
我可能错过了更多。关键是,您可以通过API获得大量免费代码和免费功能。例如,如果您查看的实现,它实际上相当短(<400行XS代码)

选择 如果您只是想寻找一种更简单的方法来实现自己的正则表达式引擎,那么请查看,它可以让您用Perl而不是C/XS来编写实现。请注意,有一个很长的列表,其中包括不支持
split
s//


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

当您询问这些模块时,这些模块的作者说了什么?这是因为在Perl中使用
s/re/repl/
比调用某些模块方法更自然。另外,您必须使用
q/re/
而不是regex文本。@CalleDybedahl我没有问他们。我认为直接向包维护人员提出这样一个基本的问题而不是一个更一般的论坛是不礼貌的。是使用另一个regexp引擎的OO包的示例