在Ruby中,如何最简单地剪切字符串开头而不是结尾?

21

在Ruby中,有时候我需要移除一个字符串开头的换行符。目前我的做法如下。我想知道最佳的方法是什么。谢谢。

s = "\naaaa\nbbbb"
s.sub!(/^\n?/, "")

1
你想保留行尾的换行符吗? - Peter Svensson
8个回答

23

lstrip 看起来是您所需的(假设尾部空格应保留):

>> s = "\naaaa\nbbbb" #=> "\naaaa\nbbbb"
>> s.lstrip #=> "aaaa\nbbbb"

文档声称:

返回一个去掉开始空格的 str 的副本。另请参见 String#rstrip 和 String#strip。

http://ruby-doc.org/core-1.9.3/String.html#method-i-lstrip


13

strip 会移除所有的末尾空格。

s = "\naaaa\nbbbb"
s.strip!

一个去除开头空白的小技巧:

str = "\nmy string"
chomped_str = str.reverse.chomp.reverse

2
只是为了澄清,String#stripString#strip!都会删除前导尾随的空格。这就是为什么在这种情况下它起作用的原因。 - tadman
是的,strip会删除所有尾随空格 :) 但我不知道他是否只需要删除前导空格还是所有空格。无论如何,前导空格没有chomp函数。 - fl00r
5
@fl00r,但是有 lstrip 函数可以仅去除前导空格 :-) 我发布了一个答案。 - Michael Kohl

11

为了更加准确,chomp 不仅可以删除字符串末尾的空格,还可以删除任意字符。

如果需要删除任意字符,可以使用以下方法:

'\naaaa\nbbbb'.delete_prefix( "\n" )

与 `strip` 相反,这个函数对任意字符都有效,就像 `chomp` 一样。

8
所以,为了澄清一点,有三种方法可以达到这个目的:subreverse.chomp.reverselstrip
我建议不要使用sub,因为它不太可读,而且它的工作方式是通过创建一个继承自旧字符串的新字符串来实现的。此外,对于相当简单的事情,你需要一个正则表达式。
那么你就只剩下reverse.chomp.reverselstrip了。很可能,你想用lstrip,因为它更快一些,但要记住,strip操作与chomp操作不同。strip会删除所有前导换行符和空格:
"\n  aaa\nbbb".reverse.chomp.reverse  # => "  aaa\nbbb"
"\n  aaa\nbbb".lstrip                 # => "aaa\nbbb"

如果你想确保只删除一个字符,并且它肯定是换行符,请使用 reverse.chomp.reverse 解决方案。如果你认为所有前导换行符和空格都是垃圾,请选择 lstrip

我能想到使用正则表达式的一种情况是,如果你有一个未知数量的 \r\n 开头,并希望将它们全部修剪掉但避免触及任何空格。你可以使用循环和更多的字符串修剪方法,但这样会更加丑陋。性能影响并不那么重要。


1
如果他只想删除一个换行符,我会说使用sub!(就地修改版)的当前解决方案比reverse.chomp.reverse要好得多。 - Michael Kohl

4
s.sub(/^[\n\r]*/, '')

这将删除前导换行符(回车和换行符,如chomp),但不会删除任何空格。


\A代表“字符串的开头”,可能比起^代表“行的开头”更为准确。但是上述表达式仍然可以按照要求工作,因为sub和星号一起确保它只匹配第一行。 - Henrik N

3

不确定这是否是最好的方法,但你可以尝试:

s.reverse.chomp.reverse

如果你想保留结束行(如果存在的话)。

1
注意:如果你将参数传递给 chomp,那么你也需要将其反转:s.reverse.chomp(x.reverse).reverse - 0xtobit

1

对于空格或非空格字符,可以使用以下方法:

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

1
这个应该适用于你:s.strip

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