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

时间:2010-11-17 21:33:19

标签: ruby string

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

13 个答案:

答案 0 :(得分:300)

irb> 'now is the time'[0...-4]
=> "now is the "

答案 1 :(得分:257)

如果您要删除的字符始终是相同的字符,请考虑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)

所以chomp比使用范围更快,大约22%。

答案 2 :(得分:52)

str = str[0...-n]

答案 3 :(得分:29)

name = "my text"
x.times do name.chop! end

在控制台中:

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

答案 4 :(得分:28)

我建议chop。我认为它已在其中一条评论中提及,但没有链接或解释,所以这就是为什么我认为它更好:

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

如果您需要删除多个字符,那么chomp是您最好的选择。这是ruby docschop所说的内容:

  

返回删除了最后一个字符的新String。如果是字符串   以\ r \ n结尾,两个字符都被删除。将印章应用于空   string返回一个空字符串。 String#chomp通常更安全   替代方案,因为如果它不以a结尾,它将保持字符串不变   记录分隔符。

虽然这主要用于删除\r\n之类的分隔符,但我用它来删除简单字符串中的最后一个字符,例如s以使单词成为单数。

答案 5 :(得分:13)

删除最后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"

答案 6 :(得分:7)

如果您使用的是rails,请尝试:

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

[已编辑]

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

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

注意:最后一个字符串char为n-1。因此,要删除最后2个,我们使用n-3。

答案 7 :(得分:6)

Ruby 2.5 +

从Ruby 2.5开始,您可以使用delete_suffixdelete_suffix!以快速且易读的方式实现这一目标。

有关方法的文档为here

如果您知道后缀是什么,那是惯用的(我认为,比这里的其他答案更具可读性):

'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)

我希望这是有用的-请注意,该方法当前不接受正则表达式,因此,如果您不知道后缀,则暂时不可行。但是,正如公认的答案(更新:在撰写本文时)指出的那样,我认为这对某些人可能有用。

答案 8 :(得分:3)

答案 9 :(得分:3)

您可以随时使用

之类的内容
 "string".sub!(/.{X}$/,'')

X是要删除的字符数。

或者分配/使用结果:

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

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

答案 10 :(得分:1)

如果您可以创建类方法并想要切掉的字符,请尝试以下方法:

vm.dishes = dishes

答案 11 :(得分:0)

使用正则表达式:

str = 'string'
n = 2  #to remove last n characters

str[/\A.{#{str.size-n}}/] #=> "stri"

答案 12 :(得分:-2)

x = "my_test"
last_char = x.split('').last