傑弗裏·弗裏德爾列出了3種主要類型的正則表達式引擎在他的書 「精通正則表達式」:R使用哪種正則表達式引擎類型作爲標準?
- 傳統NFA
- POSIX NFA
- DFA(POSIX與否)
哪這些R是否用作標準?
傑弗裏·弗裏德爾列出了3種主要類型的正則表達式引擎在他的書 「精通正則表達式」:R使用哪種正則表達式引擎類型作爲標準?
哪這些R是否用作標準?
我的理解(但我沒有看到這個官方文件)是在默認情況下將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,子,GSUB和strsplit的 。他們使用的 實現POSIX 1003.2標準:允許解釋一些範圍 和解釋這裏是由R所使用的那些目前 的執行支持一些擴展標準。
還可以在幫助頁面中進一步查看使用PCRE引擎的「類似Perl的表達式」。
這仍然沒有回答這個問題。我知道這是POSIX,但它是NFA還是DFA? – histelheim
@histelheim作爲反向引用在POSIX模式下受支持,這將是一個NFA引擎。 –
我不知道,這些條款沒有出現在R文檔或軟件包中。 '庫( 「SOS」); findFn( 「DFA」); findFn(「NFA」)只返回無關緊要的無關答案。也許別人會知道。 –
的?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
。
https://swtch.com/~rsc/regexp/說TRE使用NFA, –