【问题标题】:Skipping whitespace excluding newlines in attoparsec跳过 attoparsec 中不包括换行符的空格
【发布时间】:2014-03-24 17:55:55
【问题描述】:

Attoparsec 提供函数skipSpace

这个函数消耗所有可用的空白。

我怎样才能实现一个函数skipSpaceNoNewline 跳过除\n\r\n 之外的任何空格?

注意:这个问题故意显示没有研究工作,因为它是问答式回答的。

【问题讨论】:

    标签: haskell attoparsec


    【解决方案1】:

    您可以组合skipWhileisEndOfLine(同时匹配\n\r\n)。

    使用 lambda 函数,您可以将它们组合成一个 skipWhile 谓词,该谓词会跳过除换行符以外的任何空格。

    skipSpaceNoNewline = skipWhile (\x -> isSpace_w8 x && not (isEndOfLine x))
    

    【讨论】:

      【解决方案2】:

      为什么不直接使用skipSpaceNtoNewLine = filter (not.isSpace)

      编辑:我错了。 isSpace 没用。我以为isSpace '\n'False 但它是True。直接检查空间即可:

      [ghci] putStrLn $ filter (/=' ') $ ";df g; lkdfg\n l sd;lfk sdf"
      ;dfg;lkdfg
      lsd;lfksdf
      

      或确保您过滤正确的内容:

      [ghci] putStrLn $ filter (\m-> m `notElem` "\t\f\v") $ ";df g; lk\vdfg\n l sd;lfk sdf"
      ;df g; lkdfg
       l sd;lfk sdf
      

      所以你的函数变成了:

      skipSpaceNtoNewLine = filter  (\m-> m `notElem` "\t\f\v") 
      

      很抱歉让您感到困惑。

      【讨论】:

      • 我认为您误解了这个问题。这不是在字符串中跳过空格,而是在 attoparsec 中。您提供签名String -> String 的解决方案,但需要的是Parser ()
      • 除此之外,我认为您的算法很慢(列表中的元素,您通常应该使用集合或手写检查),但最重要的是它可能不正确,因为据我所知空格字符的类别包含超过 "\t\f\v",尤其是 unicode。
      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2015-02-12
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多