【问题标题】:Which regular expression engine type does R use as a standard?R 使用哪种正则表达式引擎类型作为标准?
【发布时间】:2015-09-11 04:27:16
【问题描述】:

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

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

R 使用其中哪些作为标准?

【问题讨论】:

标签: regex r


【解决方案1】:

?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

【讨论】:

    【解决方案2】:

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

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

    如果您在任何函数中指定perl=TRUE,那么它会切换到最类似于传统 NFA 的 pcre 库(尽管我知道它不是 F、A 或传统)。

    【讨论】:

    • ?regex 引用了 TRE 库文档。
    【解决方案3】:

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

    引用一部分:

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

    还可以在帮助页面中进一步查看“类 Perl 表达式”,它使用 PCRE 引擎。

    【讨论】:

    • 这仍然没有回答问题。我知道它是 POSIX,但它是 NFA 还是 DFA?
    • @histelheim 因为在 POSIX 模式下支持反向引用,这将是一个 NFA 引擎。
    • 我不知道,这些术语不会出现在 R 文档或包中。 library("sos"); findFn("DFA"); findFn("NFA") 只返回微不足道的、不相关的答案。也许其他人会知道。
    • @joran 是的,我自己已经解释过了 here,但还有更多的方法可以深入介绍。
    • 好吧,很遗憾得知整个正则表达式游戏还有另一层复杂性......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多