0

我的函数有问题,我想用我的函数对字符串进行模式匹配,但是在将字符串分解为子字符串时遇到了问题。我想要一个类似字符串"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]

但是当我应用我的匹配函数时,它会返回更多我想要的结果,我不知道如何过滤结果。有人可以帮助我吗?

4

1 回答 1

1

我认为这个问题是关于解析的——你想把一个字符串分解成与给定正则表达式匹配的最大块,例如“a*b*c*”。

这就像迭代的词法分析器应用程序,仅使用正则表达式。假设函数存在

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

它接受一个正则表达式字符串,一个输入字符串,并返回一对最长匹配前缀,以及输入字符串的其余部分,我们可以写

import Control.Arrow

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

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

于 2013-04-28T20:56:34.990 回答