从字符串中删除最后n
个字符的首选方法是什么?
答案 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 docs对chop
所说的内容:
返回删除了最后一个字符的新String。如果是字符串 以\ r \ n结尾,两个字符都被删除。将印章应用于空 string返回一个空字符串。 String#chomp通常更安全 替代方案,因为如果它不以a结尾,它将保持字符串不变 记录分隔符。
虽然这主要用于删除\r\n
之类的分隔符,但我用它来删除简单字符串中的最后一个字符,例如s
以使单词成为单数。
答案 5 :(得分:13)
删除最后n
个字符与保留第一个length - 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"
答案 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开始,您可以使用delete_suffix
或delete_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