在Haskell中删除换行符

时间:2010-07-30 16:11:30

标签: string list haskell

在Haskell中从字符串中删除换行符的惯用方法是什么(或者有没有)?或者我是否必须通过查找尾随的换行符/空格然后删除它们来制作自己的?

编辑:我正在寻找Python的rstrip所做的事情,但不需要可选的“chars”参数:

  

string.rstrip(s [,chars])

     

返回删除了尾随字符的字符串副本。如果是chars   省略或无,空白   字符被删除。如果给予和   不是没有,字符必须是一个字符串;该   字符串中的字符将是   从字符串的末尾剥离   调用此方法。

5 个答案:

答案 0 :(得分:10)

这是一个简单的实现(改编自Wikipedia):

import Data.Char (isSpace)
rstrip = reverse . dropWhile isSpace . reverse

Data.String.Utils中已经定义了rstrip

(顺便说一下,Hayoo!是解决此类问题的绝佳资源:搜索rstrip会将您直接带到Data.String.Utils。)

答案 1 :(得分:3)

取决于您的意思:

Prelude> filter (/= '\n') "foo\n\nbar\n"
"foobar"

Prelude> words "foo\n\nbar\n"
["foo","bar"]

但这些并不能很好地处理空间。所以也许不是你想要的。

答案 2 :(得分:3)

如果这是针对典型的文件读取应用程序,那么您应该从lines开始。这可以让您完全避免Data.String.Utils.rstrip

> lines "one time\na moose\nbit my sister\n"
["one time", "a moose", "bit my sister"]

如您所见,lines获取整个文件的文本,并将每行正确地转换为不带尾随换行符的字符串。这意味着您可以编写如下程序:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt"
  where process :: String -> String
        process = -- your code here --

答案 3 :(得分:2)

我前几天用过这个:

Prelude> let trimnl = reverse . dropWhile (=='\n') . reverse
Prelude> trimnl ""
""
Prelude> trimnl "\n"
""
Prelude> trimnl "a\n"
"a"
Prelude> trimnl "a\n\n"
"a"
Prelude> trimnl "a\nb\n"
"a\nb"

答案 4 :(得分:1)

现实世界haskell的第4章中有一个样本可以完成你想要的分裂。完成后,您需要将这些碎片粘贴在一起。 http://book.realworldhaskell.org/read/functional-programming.html

在文本中搜索“预热:可移植地分割文本行”。