2015-07-21 36 views
4

基本上我试图将String拆分为[[String]],然后将结果连接回来,但在结果列表中保留分隔符(甚至连续重复)。拆分字符串,同时保持分隔符Haskell

喜欢的东西下面的这类作品,但分隔符被碾碎成一个空间,而不是保留了所有三个空间的

unwords . map (\x -> "|" ++ x ++"|") . words $ "foo bar" 
-- "|foo| |bar|" 

理想的情况下,我能得到这样的:

"|foo|| ||bar|" -- or 
"|foo| |bar|" 

我只是我不知道如何保留分隔符,我看到的所有分割函数都将分隔符从结果列表中删除,我可以自己写一个分隔符,但它看起来像是一个标准库中的东西,在这一点上,我希望学习比Basi更多的东西其中包括熟悉更多口语化的做事方式。

我想我正在寻找像一些功能:

splitWithDelim :: Char -> String -> [String] 
splitWithDelim "foo bar" -- ["foo", " ", " ", " ", "bar"] 

或者也许是最好在这里使用正则表达式?

回答

5

您可以分割的列表,保持使用keepDelimsLkeepDelimsR功能分隔符在Data.List.Split包,像here

split (keepDelimsL $ oneOf "xyz") "aazbxyzcxd" == ["aa","zb","x","y","zc","xd"] 
+0

谢谢,这看起来很有希望。有点后续跟进,有人指出,这是不可移植的和实验性的,是刚刚过时或过于保守,还是有一个更规范的图书馆? – BWStearns

+1

@BWStearns我认为“便携性”和“稳定性”字段是创建包时经常设置的字段,然后人们往往会忘记它们在那里并且从不更新它们。 'split'包现在已经风行了,而且绝对没有什么比较正规的。 –