2012-12-05 60 views
1

我一直在幾個服務器中使用標準的UNIX正則表達式版本,這些服務器必須對錯誤具有很強的適應性。多年來,我發現了幾種情況,其中用戶輸入了格式錯誤的正則表達式,或者目標字符串中的某些奇怪字符導致了分段違例等,從而導致服務器崩潰。對於我們的系統來說這是不可接受的。防撞正則表達式?

在這些格式不正確的模式或匹配字符串周圍是否存在正則表達式的版本,只會導致錯誤而不會導致服務器崩潰?

因爲這些代碼主要是當這些模式正在被選中,我不希望使用多線程的setjmp longjmp的等

+2

'格式錯誤的正則表達式' - 編譯正則表達式並檢查異常'字符串中的一些奇怪字符 - - 如何清理輸入?而且服務器如何「崩潰」?它是軟件嗎?或整個操作系統? – nhahtdh

+1

我猜你可以期待'std :: basic_regex'和相關的非常健壯。 – Angew

+2

@Angew:如果用戶輸入'^(x * x *)* $'作爲他的正則表達式,並且在'xxxxxxxxxxxxxxxxxxxxxxy'上放開。 –

回答

2

有由谷歌最初是爲圍棋語言開發的C++ regex庫RE2,但現在已經包裝對於大多數腳本語言如Perl,Python,它聲稱:

RE2使用自動機理論,以保證正則表達式搜索時間線性 運行在輸入的大小。 RE2實現內存限制,因此可以將搜索限制在固定數量的內存中。 RE2被設計爲使用一個小的固定C++堆棧封裝號 ,它必須處理什麼輸入或正則表達式;因此RE2是 在多線程環境中非常有用,在這種環境中,線程堆棧不能隨意增大 。

所以,它似乎喜歡挑三:快速,可靠,小。