从字符串中删除最后n个字符的首选方法是什么?


当前回答

如果您正在使用rails,请尝试:

"my_string".last(2) # => "ng"

(编辑)

获取没有最后2个字符的字符串:

n = "my_string".size
"my_string"[0..n-3] # => "my_stri"

注意:最后一个字符串字符是n-1。为了去掉最后2,我们用n-3。

其他回答

如果你可以创建类方法,想要删除字符,试试这个:

class String
  def chop_multiple(amount)
    amount.times.inject([self, '']){ |(s, r)| [s.chop, r.prepend(s[-1])] }
  end
end

hello, world = "hello world".chop_multiple 5
hello #=> 'hello '
world #=> 'world'
x = "my_test"
last_char = x.split('').last

如果你想要删除的字符总是相同的字符,那么考虑chomp:

'abc123'.chomp('123')    # => "abc"

chomp的优点是:无需计数,代码可以更清楚地传达它正在做什么。

如果没有参数,chomp将删除DOS或Unix行结束符,如果它们都存在:

"abc\n".chomp      # => "abc"
"abc\r\n".chomp    # => "abc"

从评论中可以看出,使用#chomp和使用range的速度有什么不同。以下是两者的比较基准:

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)

因此,chomp比使用range快22%。

删除最后n个字符与保留第一个长度- n个字符相同。

主动支持包括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"

你可以用

 "string".sub!(/.{X}$/,'')

其中X是要删除的字符数。

或者赋值/使用结果:

myvar = "string"[0..-X]

其中X是要删除的字符数加1。