我不會將自己的答案標記爲答案,除非沒有人在幾天內擊敗它。
到目前爲止,我已經不值一文唯一的想法就是把正則表達式分成兩堆集裝箱內的一個加時。
在一堆中,每個正則表達式都帶有一些通配符,字符類或其他任何使它偏離常規字符串的東西。我會稱之爲RegexPile。
進入另一堆去的所有正則表達式是字符串或trivially可轉換爲字符串。因爲字符串很容易匹配,並且算法很好理解,所以我可以說這個堆將被排序,並且將被排序,並且在二進制搜索中查找字符串是微不足道的。我會稱之爲SortedStringArray。
天真,我可以線性搜索RegexPile和SortedStringArray做一個二進制搜索。這至少可以讓我跳過一些比較,在時間或空間方面花費很少,但也沒有太多真正的優化。
它在計算上是類似的,但是如果我做這樣的事情,我想我會爲每個正則表達式(或每個小組的正則表達式)在RegexPile中啓動一個線程。我的想法是,任何給定的正則表達式可能會帶來無限的數量,因爲正則表達式可以做到這一點。然後,如果任何線程花費太長時間,我可能會因超時而失敗並提前終止所有線程。我也認爲大多數人會在第一個字符上失敗,這意味着大多數這些線程在第一個字符被選中後會消失。隨着現在大多數系統提供的便宜寫時複製線程,此線程產卵應該足夠便宜,許多線程在我完成產卵之前將關閉,只有相似的線程在任何時候都會徘徊。然後我在另一個線程中執行二進制代碼SortedStringArray。
將它們組合成一個表達式,根據需要「捕捉」原始表達式。 – greybeard
這些(數學上講)的正則表達式,還是他們隨機設置的圖靈完全匹配函數,按照大多數正則表達式庫?他們是確切的還是子串匹配? – rici
@rici PCRE/ECMAScript正則表達式和完全匹配。但我很好奇所有變化的答案。 – Sqeaky