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#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"
如果您正在使用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