Ruby,从string中删除最后N个字符?

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

如果你想删除的字符总是相同的字符,然后考虑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 

基准testing结果(使用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比使用范围要快22%左右。

 irb> 'now is the time'[0...-4] => "now is the " 
 str = str[0...-n] 
 name = "my text" x.times do name.chop! end 

在控制台中:

 >name = "Nabucodonosor" => "Nabucodonosor" > 7.times do name.chop! end => 7 > name => "Nabuco" 

我会build议chop 。 我认为这是其中一个评论,但没有链接或解释,所以这里是为什么我认为这是更好的:

它只是从string中删除最后一个字符,而不必为此指定任何值。

如果你需要删除多个字符,那么chomp是你最好的select。 这是ruby文档不得不说的chop

返回一个删除了最后一个字符的新string。 如果string以\ r \ n结尾,则两个字符都将被删除。 将chop应用于空string会返回空string。 String#chomp通常是一个更安全的select,因为如果不以logging分隔符结束,它将使string保持不变。

虽然这主要用于删除分隔符,例如\r\n我已经用它从一个简单的string中删除了最后一个字符,例如用s来表示单数。

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

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

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

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

[EDITED]

要得到没有最后2个字符的string:

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

注意:最后一个string字符是在n-1。 所以,要删除最后2个,我们使用n-3。

你总是可以使用类似的东西

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

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

或者分配/使用结果:

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

其中X是字符数加上一个删除。

如果您可以创build类方法并希望删除字符,请尝试以下操作:

 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' 

使用正则expression式:

 str = 'string' n = 2 #to remove last n characters str[/\A.{#{str.size-n}}/] #=> "stri" 
 x = "my_test" last_char = x.split('').last