【发布时间】:2015-09-11 04:27:16
【问题描述】:
Jeffrey Friedl 在他的《掌握正则表达式》一书中列出了 3 种主要类型的正则表达式引擎:
- 传统 NFA
- POSIX NFA
- DFA(POSIX 与否)
R 使用其中哪些作为标准?
【问题讨论】:
-
swtch.com/~rsc/regexp 说 TRE 使用 NFA,
Jeffrey Friedl 在他的《掌握正则表达式》一书中列出了 3 种主要类型的正则表达式引擎:
R 使用其中哪些作为标准?
【问题讨论】:
?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。
【讨论】:
我的理解(但我在官方文档中没有找到)是 R 正则表达式函数默认使用 tcl 正则表达式库,它是 DFA 和 NFA 的混合体。
引擎将首先扫描正则表达式以查找任何非 DFA 兼容的部分并提取 DFA 的部分(因此去除回引用和其他仅在 NFA 中可用的内容)。然后,它会尝试使用 DFA 引擎找到与此(可能)简化模式的匹配项。如果找不到匹配项,则完整的正则表达式将不匹配,并返回失败。如果找到匹配项,则返回并使用 NFA 引擎匹配完整的正则表达式(我认为是传统/非 posix),但从发生简化匹配的位置开始。这比直接的 NFA 引擎快得多(对于非匹配和匹配),但仍然允许您使用 NFA 中 DFA 不支持的所有内容。
如果您在任何函数中指定perl=TRUE,那么它会切换到最类似于传统 NFA 的 pcre 库(尽管我知道它不是 F、A 或传统)。
【讨论】:
?regex 引用了 TRE 库文档。
查看?regex 了解所有血腥细节 (HTML version)。有几种选择。
引用一部分:
本节介绍默认模式下允许的正则表达式 grep、regexpr、gregexpr、sub、gsub 和 strsplit。他们使用一个 POSIX 1003.2 标准的实现:允许一些范围 用于解释,这里的解释是目前的解释 由 R 使用。该实现支持对标准的一些扩展。
还可以在帮助页面中进一步查看“类 Perl 表达式”,它使用 PCRE 引擎。
【讨论】:
library("sos"); findFn("DFA"); findFn("NFA") 只返回微不足道的、不相关的答案。也许其他人会知道。