Answers:
从Ruby 2.5开始,您可以使用delete_suffix
或delete_suffix!
以快速且易读的方式实现此目的。
方法的文档在这里。
如果您知道后缀是什么,这是惯用的(我认为,比这里的其他答案更具可读性):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
它甚至比最上面的答案要快得多(使用bang方法几乎快40%)。这是相同基准测试的结果:
user system total real
chomp 0.949823 0.001025 0.950848 ( 0.951941)
range 1.874237 0.001472 1.875709 ( 1.876820)
delete_suffix 0.721699 0.000945 0.722644 ( 0.723410)
delete_suffix! 0.650042 0.000714 0.650756 ( 0.651332)
我希望这是有用的-请注意,该方法当前不接受正则表达式,因此,如果您不知道后缀,则暂时不可行。但是,正如被接受的答案(更新:在撰写本文时)指出的那样,我认为这对某些人可能有用。
What is the preferred way of removing the last n characters from a string?
irb> 'now is the time'[0...-4]
=> "now is the "
[0...-4]
不是[0..-4]
如果要删除的字符始终是相同的字符,请考虑chomp
:
'abc123'.chomp('123') # => "abc"
的优点chomp
是:无需计数,并且代码可以更清楚地传达其正在执行的操作。
如果没有参数,则chomp
删除DOS或Unix行结尾(如果存在):
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
从评论中可以#chomp
看出,使用速度与使用范围的速度有关。这是比较两者的基准:
require 'benchmark'
S = 'asdfghjkl'
SL = S.length
T = 10_000
A = 1_000.times.map { |n| "#{n}#{S}" }
GC.disable
Benchmark.bmbm do |x|
x.report('chomp') { T.times { A.each { |s| s.chomp(S) } } }
x.report('range') { T.times { A.each { |s| s[0...-SL] } } }
end
基准测试结果(使用CRuby 2.13p242):
Rehearsal -----------------------------------------
chomp 1.540000 0.040000 1.580000 ( 1.587908)
range 1.810000 0.200000 2.010000 ( 2.011846)
-------------------------------- total: 3.590000sec
user system total real
chomp 1.550000 0.070000 1.620000 ( 1.610362)
range 1.970000 0.170000 2.140000 ( 2.146682)
因此,排骨比使用范围快约22%。
chomp!()
它就地对String进行操作。
str = str[0...-n]
我建议chop
。我认为它已在评论之一中提到,但没有链接或解释,因此这就是我认为更好的原因:
它只是从字符串中删除最后一个字符,而不必指定任何值来实现。
如果您需要删除多个字符,那么chomp
最好的选择是。这是ruby文档必须说的chop
:
返回删除了最后一个字符的新String。如果字符串以\ r \ n结尾,则两个字符都将被删除。将chop应用于空字符串将返回一个空字符串。String#chomp通常是一种更安全的选择,因为如果字符串未以记录分隔符结尾,则它将保持不变。
尽管此方法主要用于删除分隔符,例如\r\n
我已使用它来删除简单字符串中的最后一个字符,例如使用s
来使单词为单数。
删除最后一个n
字符与保留第一个字符相同length - n
字符。
Active Support包括String#first
和String#last
提供了方便的方法来保留或删除第一个/最后一个n
字符的方法:
require 'active_support/core_ext/string/access'
"foobarbaz".first(3) # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3) # => "baz"
"foobarbaz".last(-3) # => "barbaz"
如果您使用滑轨,请尝试:
"my_string".last(2) # => "ng"
[编辑]
要获取字符串而没有最后两个字符:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
注意:最后一个字符串char在n-1处。因此,要删除最后一个2,我们使用n-3。
您可以随时使用类似
"string".sub!(/.{X}$/,'')
X
要删除的字符数在哪里。
或分配/使用结果:
myvar = "string"[0..-X]
其中X
的字符数加一个要删除的字符。
使用正则表达式:
str = 'string'
n = 2 #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
delete_suffix
在Ruby 2.5中使用。更多信息在这里。