Jeffrey Friedl在他的“掌握正则表达式”一书中列出了3种主要的正则表达式引擎:
R中哪一个用作标准?
答案 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或传统的)。