【发布时间】:2019-06-22 11:59:29
【问题描述】:
我想像这样在非转义空格处拆分我的字符串:
let s = "number\\ 1 number\\ 2 number\\ 3"
["number\\ 1", "number\\ 2", "number\\ 3"]
or even better
["number 1", "number 2", "number 3"]
我该怎么做?
尝试 1:
let s = "number\\ 1 number\\ 2 number\\ 3"
splitWhitespace :: String -> [String]
splitWhitespcae s = splitOn " " s
-- returns ["number\\","1","number\\","2","number\\","3"]
concatBackslash :: [String] -> [String]
concatBackslash [] = []
concatBackslash (x : xx : xs) = case init x of
"\\" -> (x ++ xx) : concatBackslash xs
_ -> x : xx : concatBackslash x
但由于某种原因,这会返回相同的列表。
尝试 2:
splitOnWhitespace :: String -> [String]
splitOnWhitespace s = splitOn " " s
concatBackslash :: [String] -> [String]
concatBackslash [] = []
concatBackslash [x, xs] = case last x of
'\\' -> [(init x) ++ xs]
_ -> [x, xs]
concatBackslash (x : xx : xs) = case last x of
'\\' -> concatBackslash (((init x) ++ xx) : xs)
_ -> x: concatBackslash (xx : xs)
这是在@leftaroundabout 的帮助下完成的,但我确实没有空格。
> let s = "number\\ 1 number\\ 2 number\\ 3"
> concatBackslash $ splitOnWhitespace s
["number1","number2","number3"]
【问题讨论】:
-
那不是有效的 Haskell 代码。我想你的意思是
s = "number\\ 1 num...",或者IOW,s的原始内容是number\ 1等等? -
是的,很抱歉。
-
好的。但你也应该自己努力解决问题。见idownvotedbecau.se/noattempt
-
我发布了我的尝试
-
我们拥有出色的解析器组合库,在其中这将是完全轻松的。查看this similar question,了解其中一个库的解析器代码是什么样的。