能否截取字符串,例如
"one , Two"
转换为列表
["one", "two"]
或者只是
"one", "two"
谢谢
有一整个模块的函数,用于不同的列表分割策略(如字符串,它只是一个字符列表):Data.List.Split
使用该功能,您可以执行以下操作:
import Data.List.Split
> splitOn " , " "one , Two"
["one","Two"]
在这里,普通的列表操作就足够了。
import Data.Char
> [ w | w <- words "one , Two", all isAlpha w ]
["one","Two"]
aka
> filter (all isAlpha) . words $ "one , Two"
["one","Two"]
列表操作、解析和设计
在文本处理中,有一种权力和重量的规模。最简单的基于列表的解决方案(如上面的示例)提供了非常少的语法噪音,以获取快速结果(与shell脚本中的快速文本处理相同)。
列表操作可以变得非常复杂,您可以考虑使用通用的split库,在任意文本上拆分列表。
> splitOn " , " "one , Two"
["one","Two"]
"one |,Two" -> ["one |","Two"]
这种情况怎么处理?(例如:不要使用非分隔符的包含) - user166390如果你不想安装split package(可查看Frerich Raabe的答案),这里有一个轻量级的splitOn
函数实现:
import Data.List
splitOn :: Eq a => [a] -> [a] -> [[a]]
splitOn [] _ = error "splitOn: empty delimiter"
splitOn delim xs = loop xs
where loop [] = [[]]
loop xs | delim `isPrefixOf` xs = [] : splitOn delim (drop len xs)
loop (x:xs) = let (y:ys) = splitOn delim xs
in (x:y) : ys
len = length delim
未经测试,使用Parsec。可能还有一个正则表达式分隔符。
firstElement :: Parser String
firstElement = many $ noneOf ' '
otherElement :: Parser String
otherElement = do many $ char ' '
char ','
many $ char ' '
firstElement
elements :: Parser [String]
elements = liftM2 (:) firstElement (many otherElement)
parseElements :: String -> [String]
parseElements = parse elements "(unknown)"
清理otherElement
会很好,类似于我使用liftM2
折叠elements
的方式。
cabal install split
来安装它。 - Joey Adams