将字符串分解为haskell中的子字符串

时间:2013-04-28 12:49:56

标签: string haskell

我的函数有问题,我想在函数上对字符串进行模式匹配,但是我遇到了将字符串分解为子字符串的问题。我想要一个像"ccaabbccaacc"这样的字符串和一个像"a*b*c*"这样的常规表达式来获取["cc", "aabbcc", "aacc", ""],这是一个带有断开子字符串的列表。我已经创建了这个函数,它返回子串的所有部分

parts :: [a] -> [[[a]]]
parts [ ] = [[ ]]
parts [c] = [[[c]]]
parts (c : cs) = concat [[(c : p) : ps ,[c] : p : ps] | p : ps <- parts cs]

但是当我将所有匹配功能应用于所有结果时,它会返回更多我想要的内容并且我不知道如何过滤结果。 Somene可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我认为这个问题是关于解析 - 你想要将一个字符串分解成与给定正则表达式匹配的最大块,例如“A * B * C *”。

这就像迭代的词法分析器应用程序,只有regexp。假设存在函数

reglex :: String -> String -> (String, String)

取一个regexp字符串,一个输入字符串,并返回一对最长的匹配前缀,其余的输入字符串,我们可以写

import Control.Arrow

parts reg str = ($ ("",str)) $
   iterate (reglex reg . snd) >>>
   tail >>>
   span (not.null.fst) 

然后用这个结果做点什么。