正如您所知,有兩種不同的正則表達式實現:一種使用回溯(pcre),另一種使用有限自動機(re2)。帶O(N)和反向引用支持的正則表達式
這兩種算法都有其侷限性:在特定情況下,pcre可能需要指數時間才能找到匹配,而有限自動機不支持反向引用。
PCRE實現支持反向引用,像/a?a?a?a?aaaa/
對aaaa
表達式匹配效率非常低,越a
的表達和輸入有 - 的時間也就越長,並與他們的30+如果時間會花費很多。
與有限自動機版很好地處理所有的這些實施方式和具有O(N) 從輸入的複雜性,但不支持反向引用:
PCRE時間針對複雜的表達式 - http://i.stack.imgur.com/D4gkC.png NFA處理那些,但不支撐反向引用 - http://i.stack.imgur.com/t2EwI.png
上支持反向引用一些資料:
RE2 - http://code.google.com/p/re2/
一個重要的例外是,RE2不支持反向引用和廣義零寬度斷言,因爲它們無法有效實施。
湯普森NFA - http://swtch.com/~rsc/regexp/regexp1.html
正如前面提到的,沒有人知道如何實現與反向引用有效正則表達式,儘管沒有人能夠證明這是不可能的要麼。 (具體地講,這個問題是NP完全的,這意味着如果有人沒有找到一個有效的實施,這將是計算機科學家重大新聞,將贏得100萬美元的獎金。)
所以我創建了自己的版本,這兩個支持反向引用並具有O(N)複雜性。它用haskell編寫,大約有600個(〜200個是空白的,200個類型的聲明,可以跳過)。它嚼通過/a?a?aa/
對aa
(與a
100)約10秒,據我所知,它是唯一版本,可以匹配
/a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?(a?a?a?a?a?a?a?a?a?a?aaaaaaaaaa)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\1/
對
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
在理智(約10秒)的時間。它當然支持我在互聯網上找到的基本正則表達式規範中列出的所有其他功能。
問題是:它真的是一個「計算機科學家的重大新聞」,如果是這樣,我該怎麼辦? PS:我將在一週內顯示源代碼 - 我仍然想用分析器運行一些測試並替換一些內部數據結構。
你不能讓一個要求有關解決人們已經爲此奮鬥硬ComSci問題幾十年沒有一些證據。顯示你的算法,或者你的代碼,或者等到你可以。其他任何事情只是一個隨機的隨意聲稱在隨機的網站上。 – mpeters 2010-11-02 15:20:14
我其次...引用您發佈的其中一個網址:反向引用。如前所述,沒有人知道如何有效地使用反向引用來實現正則表達式,儘管沒有人能證明它也是不可能的。 (具體來說,這個問題是NP完全的,這意味着如果有人確實找到了有效的實現方式,這對計算機科學家來說是一個重大消息,並且會贏得一百萬美元的獎金。 – 2010-11-02 16:21:12