Regex 我可以保存正则表达式状态以供下次输入吗?

Regex 我可以保存正则表达式状态以供下次输入吗?,regex,haskell,finite-automata,Regex,Haskell,Finite Automata,我用一些数据解析TCP数据包,这些数据可以分为几个数据包。我无法保存数据包,所以在传递第一个数据包后,我无法再次读取它。我需要知道数据中是否有我的模式,例如,当第一个数据包包含“hello wo”和第二个数据包包含“rld!”时,我想知道序列中是否有“world” 例如,我有两个文件,可以在其中搜索: -- file: Seq.hs import Text.Regex.TDFA import System.Environment main = do args <- getArgs

我用一些数据解析TCP数据包,这些数据可以分为几个数据包。我无法保存数据包,所以在传递第一个数据包后,我无法再次读取它。我需要知道数据中是否有我的模式,例如,当第一个数据包包含“hello wo”和第二个数据包包含“rld!”时,我想知道序列中是否有“world”

例如,我有两个文件,可以在其中搜索:

-- 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)
--文件:Seq.hs
导入Text.Regex.TDFA
导入系统。环境
main=do

我建议您使用args而不是正则表达式。它速度快、坚固耐用,并允许:

一种快速解析器组合器库,特别旨在有效处理网络协议和复杂的文本/二进制文件格式

正则表达式很容易变得难看,特别是在Haskell中,使用类型化组合器解析库可以让事情变得更清楚

还有一个一揽子计划:

实用函数,用于针对套接字运行解析器,而不需要更大的框架,如管道或导管


罗曼·切普利亚卡一直在努力!请参见
regex applicative
。我知道他还没有达到他想要的性能,而且接口有点有限,但是如果你真的想解析一种常规语言,它提供了一种非常好的方法。AttorParsec需要注意:注意:增量输入并不意味着AttorParsec在进行垃圾收集时会释放其内部状态的一部分。它的内部表示相当于一个ByteString:如果将增量输入提供给解析器,它将需要与您提供的输入量成比例的内存。(这是支持任意回溯所必需的)这对我不好,因为它可能是大输入,分成小数据包,并且无法保存所有内容。我认为regex也使用回溯,所以在我的问题上,更好的例子是像阿霍·科拉西克这样的足总。