从字符串中删除最后n字符的首选方法是什么?
n
str = str[0..-1-n]
与[0...-n]不同,它处理n=0的情况。
[0...-n]
查看slice()方法:
slice()
http://ruby-doc.org/core-2.5.0/String.html#method-i-slice
irb> 'now is the time'[0...-4] => "now is the "
你可以用
"string".sub!(/.{X}$/,'')
其中X是要删除的字符数。
X
或者赋值/使用结果:
myvar = "string"[0..-X]
其中X是+ 1要删除的字符数。
如果你想删除的字符总是相同的字符,那么考虑chomp:
chomp
'abc123'.chomp('123') # => "abc"
chomp的优点是:没有计数,代码更清楚地传达它正在做什么。
如果不带参数,chomp将删除DOS或Unix行结束符,如果其中任何一个存在:
"abc\n".chomp # => "abc" "abc\r\n".chomp # => "abc"
从评论中,有一个使用#chomp和使用range的速度的问题。以下是两者的比较基准:
#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比使用range快22%。
x = "my_test" last_char = x.split('').last
我建议chop。我认为其中一条评论中提到了它,但没有链接或解释,所以我认为它更好的原因如下:
chop
它只是从字符串中删除最后一个字符,您不必为此指定任何值。
如果你需要删除一个以上的字符,那么chomp是你最好的选择。这是ruby文档必须对chop说的话:
返回一个删除最后一个字符的新字符串。如果字符串 以\r\n结尾,两个字符都被删除。应用chop到空 String返回空字符串。String#chomp通常更安全 可选项,因为如果字符串不以。结尾,则保持字符串不变 记录分隔符。< / p >
虽然这主要用于删除分隔符,如\r\n,但我已经使用它来删除一个简单字符串的最后一个字符,例如s使单词成为单数。
\r\n
s
name = "my text" x.times do name.chop! end
在控制台:
>name = "Nabucodonosor" => "Nabucodonosor" > 7.times do name.chop! end => 7 > name => "Nabuco"
如果您正在使用rails,请尝试:
"my_string".last(2) # => "ng"
(编辑)
获取没有最后2个字符的字符串:
n = "my_string".size "my_string"[0..n-3] # => "my_stri"
注意:最后一个字符串字符是n-1。为了去掉最后2,我们用n-3。
如果你可以创建类方法,想要删除字符,试试这个:
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'
删除最后的n字符与保留第一个length - n字符相同。
length - n
主动支持包括String#first和String#last方法,它们提供了一种方便的方式来保留或删除第一个/最后一个n字符:
String#first
String#last
require 'active_support/core_ext/string/access' "foobarbaz".first(3) # => "foo" "foobarbaz".first(-3) # => "foobar" "foobarbaz".last(3) # => "baz" "foobarbaz".last(-3) # => "barbaz"
使用正则表达式:
str = 'string' n = 2 #to remove last n characters str[/\A.{#{str.size-n}}/] #=> "stri"
从Ruby 2.5开始,你可以使用delete_suffix或delete_suffix!以一种快速且易读的方式来实现这一点。
delete_suffix
delete_suffix!
方法上的文档是在这里。
如果你知道后缀是什么,这是惯用的(我认为,甚至比这里的其他答案更具可读性):
'abc123'.delete_suffix('123') # => "abc" 'abc123'.delete_suffix!('123') # => "abc"
它甚至比上面的答案要快得多(几乎是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)
我希望这是有用的-注意,该方法目前不接受正则表达式,所以如果你不知道后缀,它是不可行的。然而,由于公认的答案(更新:在撰写本文时)指示相同,我认为这可能对一些人有用。