我的函数有问题,我想在函数上对字符串进行模式匹配,但是我遇到了将字符串分解为子字符串的问题。我想要一个像"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可以帮帮我吗?
答案 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)
然后用这个结果做点什么。