从字符串中去除空格

6
我希望去掉\n后面的空格。
例如,username 123\n ugas 423\n peter 23\n asd234 将变成 username 123\nugas 423\npeter 23\nasd234

6
10个问题,0个采纳?请重新考虑。所有答案都不可能那么糟糕。 - user166390
2个回答

16

我假设你想要删除每行开头的一个或多个空白字符,而不仅仅是第一个空白字符。此外,我认为你想要删除任何类型的空白字符,比如制表符,而不仅仅是字面上的空格字符。

import Data.Char

stripLeadingWhitespace :: String -> String
stripLeadingWhitespace = unlines . map (dropWhile isSpace) . lines

我理解了您的解释。在 Haskell 中,f('\n':' ':a)被称为常量模式。递归函数只有两个参数f(a:b)= a:f b,但是该模式具有三个参数,我不理解它的含义。 - nicholas

5
f [] = []
f ('\n':' ':a) = f ('\n' : a)
f (a:b) = a : f b

这个解决方案只会在每个换行符后面删除一个空格。如果意图是在每个换行符后删除所有前导空格(从描述中不清楚),那么对第二行进行的这个小更改就可以实现:f ('\n':' ':a) = f ('\n':a) - Vineet
谢谢你的提示,我已经修改了我的答案。 - yfeldblum
1
你能解释一下这个解决方案吗?Justice。 - nicholas
它接受一个字符列表,每当列表以<cr><space>序列开头时,它将其替换为<cr>并重新处理列表。如果列表不以<cr><space>开头,则它会取出第一个字符并附加剩余的列表(在处理后)。这个解决方案肯定有效,但我个人认为下面提到的那个解决方案(unlines.map(dropWhile isSpace).lines)更符合惯用语。 - hdan
我理解你的解释。 在Haskell中,f('\n':' ':a)被称为常量模式。 递归函数只有两个参数f(a:b)= a:f b,但是该模式具有三个参数。我不理解这个。 - nicholas
Haskell使用空格来分隔函数名和它们的参数(例如“foo x y”),而许多其他语言使用括号和逗号(例如“foo(x, y)”)。在这里,“f”是一个带有一个参数的函数。该参数是一个字符列表(字符串)。只要字符串变短,我们就可以使用递归。 “f []”是非递归基本情况,“f('\n':' ':a)”在“('\n':a)”上递归,该字符串比原来短一个字符,“f(a:b)”在“b”上递归,该字符串比原来短一个字符。“x:y:z”是列表的语法。 - Warbo

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