2015-06-24 58 views

回答

1

我的理解(但我沒有看到這個官方文件)是在默認情況下將R正則表達式函數使用TCL正則表達式庫,是DFA和NFA的混合體。

該發動機將首先掃描任何非DFA兼容件和提取部分是DFA的正則表達式(所以剔除了反向引用和其他東西,只可在NFA)。然後嘗試使用DFA引擎找到與此(可能)簡化模式的匹配。如果它找不到匹配,那麼完整的正則表達式不匹配,並返回一個失敗。如果它找到匹配,則它返回並使用NFA引擎(我認爲是傳統/非posix)匹配完整正則表達式,但是從簡化匹配發生的位置開始。與直接NFA引擎相比,這非常快速(對於非匹配和匹配),但仍然可以讓您在NFA中使用DFA不支持的所有內容。

如果您在任何函數中指定了perl=TRUE,那麼它會切換到最像傳統NFA的pcre庫(儘管我明白它不是F,A或傳統)。

+0

''regex'引用TRE庫文檔。 –

1

採取在看看?regex所有血淋淋的細節(HTML version)。有幾個選項。

引述一個部分:

本節介紹允許在默認模式中的正則表達式的grep,regexpr,gregexpr,子,GSUB和strsplit的 。他們使用的 實現POSIX 1003.2標準:允許解釋一些範圍 和解釋這裏是由R所使用的那些目前 的執行支持一些擴展標準。

還可以在幫助頁面中進一步查看使用PCRE引擎的「類似Perl的表達式」。

+0

這仍然沒有回答這個問題。我知道這是POSIX,但它是NFA還是DFA? – histelheim

+3

@histelheim作爲反向引用在POSIX模式下受支持,這將是一個NFA引擎。 –

+0

我不知道,這些條款沒有出現在R文檔或軟件包中。 '庫( 「SOS」); findFn( 「DFA」); findFn(「NFA」)只返回無關緊要的無關答案。也許別人會知道。 –

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

相關問題