【问题标题】:How to split a String at white-spaces, which are not escaped?如何在未转义的空白处拆分字符串?
【发布时间】: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,了解其中一个库的解析器代码是什么样的。

标签: string list haskell


【解决方案1】:

两个问题:

  • init 为您提供所有除了字符串中的最后一个字符。但是当您尝试与"\\" 匹配时,那将是确实最后一个字符。因此,您实际上应该在 case 语句中使用 last
  • 但是,当++将该元素与下一个元素一起使用时,您确实需要init。在这种情况下,您不想保留结尾的 \,而是保留在它之前。

【讨论】:

  • 我调整了您的提示并完成了一半的工作,但是我最终没有空格...您能看看我的第二次尝试吗?
  • 嗯,你已经在开始时无条件地分割了空格。您需要更改拆分功能,或者将空格放回您正在处理 \ 符号的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多