在Ruby中,有时候我需要移除一个字符串开头的换行符。目前我的做法如下。我想知道最佳的方法是什么。谢谢。
s = "\naaaa\nbbbb"
s.sub!(/^\n?/, "")
lstrip
看起来是您所需的(假设尾部空格应保留):
>> s = "\naaaa\nbbbb" #=> "\naaaa\nbbbb"
>> s.lstrip #=> "aaaa\nbbbb"
文档声称:
返回一个去掉开始空格的 str 的副本。另请参见 String#rstrip 和 String#strip。
strip
会移除所有的末尾空格。
s = "\naaaa\nbbbb"
s.strip!
一个去除开头空白的小技巧:
str = "\nmy string"
chomped_str = str.reverse.chomp.reverse
String#strip
和String#strip!
都会删除前导和尾随的空格。这就是为什么在这种情况下它起作用的原因。 - tadmanstrip
会删除所有尾随空格 :) 但我不知道他是否只需要删除前导空格还是所有空格。无论如何,前导空格没有chomp
函数。 - fl00rlstrip
函数可以仅去除前导空格 :-) 我发布了一个答案。 - Michael Kohl为了更加准确,chomp
不仅可以删除字符串末尾的空格,还可以删除任意字符。
如果需要删除任意字符,可以使用以下方法:
'\naaaa\nbbbb'.delete_prefix( "\n" )
sub
、reverse.chomp.reverse
和lstrip
。sub
,因为它不太可读,而且它的工作方式是通过创建一个继承自旧字符串的新字符串来实现的。此外,对于相当简单的事情,你需要一个正则表达式。reverse.chomp.reverse
和lstrip
了。很可能,你想用lstrip
,因为它更快一些,但要记住,strip
操作与chomp
操作不同。strip
会删除所有前导换行符和空格:"\n aaa\nbbb".reverse.chomp.reverse # => " aaa\nbbb"
"\n aaa\nbbb".lstrip # => "aaa\nbbb"
如果你想确保只删除一个字符,并且它肯定是换行符,请使用 reverse.chomp.reverse
解决方案。如果你认为所有前导换行符和空格都是垃圾,请选择 lstrip
。
我能想到使用正则表达式的一种情况是,如果你有一个未知数量的 \r
和 \n
开头,并希望将它们全部修剪掉但避免触及任何空格。你可以使用循环和更多的字符串修剪方法,但这样会更加丑陋。性能影响并不那么重要。
sub!
(就地修改版)的当前解决方案比reverse.chomp.reverse
要好得多。 - Michael Kohls.sub(/^[\n\r]*/, '')
这将删除前导换行符(回车和换行符,如chomp),但不会删除任何空格。
\A
代表“字符串的开头”,可能比起^
代表“行的开头”更为准确。但是上述表达式仍然可以按照要求工作,因为sub
和星号一起确保它只匹配第一行。 - Henrik N不确定这是否是最好的方法,但你可以尝试:
s.reverse.chomp.reverse
chomp
,那么你也需要将其反转:s.reverse.chomp(x.reverse).reverse
。 - 0xtobit对于空格或非空格字符,可以使用以下方法:
s = "\naaaa\nbbbb"
s.slice!("\n") # returns "\n" but s also has the first newline removed.
puts s # shows s has the first newline removed
s.strip
。