从字符串中删除最后n个字符的首选方法是什么?
当前回答
如果您正在使用rails,请尝试:
"my_string".last(2) # => "ng"
(编辑)
获取没有最后2个字符的字符串:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
注意:最后一个字符串字符是n-1。为了去掉最后2,我们用n-3。
其他回答
如果你想要删除的字符总是相同的字符,那么考虑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%。
如果你可以创建类方法,想要删除字符,试试这个:
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'
使用正则表达式:
str = 'string'
n = 2 #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
你可以用
"string".sub!(/.{X}$/,'')
其中X是要删除的字符数。
或者赋值/使用结果:
myvar = "string"[0..-X]
其中X是要删除的字符数加1。
irb> 'now is the time'[0...-4]
=> "now is the "
推荐文章
- Printf与std::字符串?
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 如何在PHP中截断字符串最接近于一定数量的字符?
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 为什么在Java和。net中不能修改字符串?
- 如何创建一个日期对象从字符串在javascript
- 如何测试参数是否存在在轨道