2015-05-18 22 views
2

我用一些數據解析TCP數據包,這個數據可以分成幾個包。我無法保存數據包,因此在傳遞第一個數據包之後,我無法再讀取它。我需要知道數據中是否有我的模式,例如,第一個數據包包含「hello wo」,第二個包含「rld!」我想知道是否有順序的「世界」。我可以保存下一個輸入的正則表達式狀態嗎?

對於簡單的例子,我有兩個文件,我可以在其中進行搜索:

-- file: Seq.hs 
import Text.Regex.TDFA 
import System.Environment 

main = do 
    args <- getArgs 
    inpStr1 <- readFile (args !! 0) 
    putStrLn $ show (inpStr1 =~ "foo" :: Bool) 
    inpStr2 <- readFile (args !! 1) 
    putStrLn $ show (inpStr2 =~ "foo" :: Bool) 

我能保存FA的狀態處理inpStr1繼續inpStr2搜索後?

回答

3

而不是正則表達式我建議你使用attoparsec。它的快速,穩健,並允許incremental input

快速解析器組合庫,在用網絡協議和複雜的文本/二進制文件格式處理效率特別針對。

正則表達式變得很容易,特別是在Haskell中,使用類型化的組合器解析庫使事情變得更加清晰。

另外也包network-attoparsec

效用函數運行鍼對插座解析器,而無需如管道或導管更大的框架。

+0

Roman Cheplyaka一直在努力!請參閱'正則表達式應用程序'。我知道他還沒有得到他想要的表現,而且界面有點有限,但如果你真的只想分析一種常規語言,它提供了一個非常好的方法來完成它。 – dfeuer

+1

attoparsec有一個註釋: 注意:增量輸入並不意味着attoparsec將在垃圾收集過程中釋放垃圾收集的內部狀態的一部分,它的內部表示等價於一個ByteString:如果將增量輸入饋送給解析器,它需要的存儲量與你提供的輸入量成正比(這對於支持任意的回溯是必要的) 這對我來說不好,因爲它可能是大輸入,被分成小包並且不能全部保存。 我認爲正則表達式也使用回溯,所以在我的問題中,更好的情況是一些FA像aho-corasick。 – Vladilen

相關問題