在Haskell中去除换行符

8
有没有惯用的方法可以在Haskell中删除字符串中的换行符?或者我必须自己找到尾随的换行符/空格,然后将它们删除?
编辑:我正在寻找类似于Python的rstrip的功能,但不需要可选的“chars”参数:
string.rstrip(s[, chars])
返回去除尾随字符的字符串副本。如果省略了chars或为None,则会删除空白字符。如果给出并且不是None,则chars必须是一个字符串;将从该方法所调用的字符串末尾删除字符串中的字符。

2
虽然你的问题和各种回答都涉及在Haskell中实现Python的rstrip函数,但在大多数情况下,在Haskell中使用它并不是很惯用。通常情况下,除非有特殊原因,否则你会使用lineswords - Yitz
5个回答

10

这是一个简单的实现(改编自维基百科):

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

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

(顺便说一句,Hayoo!是这种问题的一个很好的资源:搜索 rstrip 将直接带您到Data.String.Utils。)


5
我前几天用了这个:
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"

这与Travis的答案原理相同。 - kennytm
是的,我猜我们同时输入了。但我的代码实现了帖子所要求的功能!请投票给我! :) - Simon Michael
我认为trimnl = reverse。dropwhile(elem“\ n \ r \ t”). reverse会更接近于Python中的rtrim。 - Tim Perry
如果有人在意的话,我的对 elem 的调用在我提交评论时失去了反引号。 - Tim Perry
Tim: 我不确定SO escape是什么意思( `testing` - 是的,它是 \),但对于Haskell,你至少可以使用flip。 trimnl = reverse . dropWhile (flip elem "\n\r\t") - Thomas M. DuBuisson

4

如果这是一个典型的文件读取应用程序,那么你可能应该从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

根据你的意思而定:

Prelude> filter (/= '\n') "foo\n\nbar\n"
"foobar"
Prelude> words "foo\n\nbar\n" ["foo","bar"]

但是这些不能很好地处理空格。所以可能不是你要找的。


2
这两个方法实际上都没有“剥离”字符串(通常意义上的“删除前导或尾随字符”)。 - Travis Brown

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接