R使用哪种正则表达式引擎类型作为标准?

时间:2015-06-24 19:39:06

标签: regex r

Jeffrey Friedl在他的“掌握正则表达式”一书中列出了3种主要的正则表达式引擎:

  • 传统NFA
  • POSIX NFA
  • DFA(POSIX与否)

R中哪一个用作标准?

3 个答案:

答案 0 :(得分:6)

?regex页面引用了TRE文档。在我们看到grep.c source的顶部附近:

/* As from TRE 0.8.0, tre.h replaces regex.h */
#include <tre/tre.h>

复制我之前的评论:http://swtch.com/~rsc/regexp说TRE使用NFA。然后PCRE用于perl=TRUE

答案 1 :(得分:1)

请查看?regex了解所有血腥细节(HTML version)。有几种选择。

引用一部分:

  

本节介绍默认模式下允许的正则表达式       grep,regexpr,gregexpr,sub,gsub和strsplit。他们使用了       POSIX 1003.2标准的实现:允许一些范围       对于解释和这里的解释是目前的解释       由R.使用。该实现支持对标准的一些扩展。

还可以在帮助页面中进一步查看“Perl-like expressions”,它使用PCRE引擎。

答案 2 :(得分:1)

我的理解(但我在官方文档中没有发现这一点)是R regex函数默认使用tcl正则表达式库,它是DFA和NFA的混合体。

引擎将首先扫描正则表达式以查找任何非DFA兼容的部分并提取DFA部分(因此剥离后引用和仅在NFA中可用的其他内容)。然后它尝试使用DFA引擎找到与此(可能)简化模式的匹配。如果找不到匹配,则完整的正则表达式将不匹配,并返回失败。如果它找到匹配,那么它会返回并使用NFA引擎(我认为传统/非posix)匹配完整的正则表达式,但是从发生简化匹配的位置开始。这比非直接NFA引擎要快得多(对于非匹配和匹配),但仍允许您使用DFA不支持的NFA中的所有内容。

如果你在任何函数中指定perl=TRUE,那么它会切换到最像传统NFA的pcre库(虽然我知道它不是F,A或传统的)。