2010-11-17 512 views

回答

222

如果你想删除字符总是相同的字符,然后再考虑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) 

所以格格比使用范围更快,由〜22%。

+5

印章也是一种选择。对于被删除的内容不那么挑剔。 – 2011-11-04 12:04:23

+0

算法上,会不会像[0 ..-#]那样更快? chomp必须解析一个字符串来寻找匹配。排除和结束字符号码不。 – Plasmarob 2013-10-04 16:12:16

+0

@Plasmarob,这将是一个很好的基准。 – 2013-10-04 16:19:20

47
str = str[0...-n] 
+5

请注意,这只适用于Ruby 1.9。在Ruby 1.8中,这将删除最后的*字节*,而不是最后的*字符*。 – 2010-11-17 23:21:14

+5

这比选择的答案要好,因为3个点(...)更易于记忆,因为-n表示从字符串的末尾取出n个字符。 – lulalala 2011-11-03 04:24:13

+0

也是“abcd”[0 ..- 2]#=>“abc”,而“abcd”[0 ...- 2]#=>“ab”。在我看来,3点范围选项会产生一个更自我解释的代码。 – mokagio 2013-07-29 08:56:15

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

请注意,这只适用于Ruby 1.9。在Ruby 1.8中,这将删除最后的*字节*,而不是最后的*字符*。 – 2010-11-17 23:20:51

+2

但他可能是指*“字节”*,如果他使用1.8.x. – DigitalRoss 2011-08-27 17:29:59

+3

这是行不通的,但我发现'abc123'.chomp('123')对于短和长的字符串来说快两倍。 (Ruby 2.0.0-p247) 任何人都可以证实这一点吗? – Plasmarob 2013-10-04 16:59:39

2

您可以随时使用类似

"string".sub!(/.{X}$/,'') 

哪里X是字符数删除。

或者与分配/使用结果:

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

其中X是字符加一去除的数量。

-2
x = "my_test" 
last_char = x.split('').last 
+1

问题是关于从字符串中删除最后N个字符,而不是找到最后一个字符 – unnitallman 2012-10-20 06:30:32

24

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

它只是从字符串中删除最后一个字符,而不必指定任何值发生。

如果您需要删除多个字符,那么chomp是您最好的选择。这就是ruby docs不得不说的大约chop

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

虽然这大多采用去除如\r\n我用它来从一个简单的字符串中删除的最后一个字符分隔,例如s,使字奇异。

+1

难道那不就是删除那个单个最后一个字符吗?问题是关于复数的“字符” – maetthew 2013-02-10 02:54:54

+0

是的,你是对的,但chomp('chars')将删除最后的'chars'。我不清楚OP是想要特定的字符还是只有N个字符。 – kakubei 2013-02-11 08:43:22

+0

有趣的是,这是正确的答案 – Amala 2013-04-12 23:51:12

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

在这里,在控制台:

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

如果你正在使用的轨道,试试:

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

将帖子

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

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

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

+1

这并不删除最后两个字母。它返回它们。 – 2015-04-11 21:59:44

+0

你不需要首先测量字符串,Ruby本身使用字符串末尾的负指数 – 2016-11-25 15:18:42

1

如果你确定与创建类的方法,想砍掉的字符,试试这个:

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

删除最后一个字符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" 
+0

这是正确的答案。 – alex 2017-07-08 19:42:08

+1

@alex:这是Rails的正确答案。 – 2018-02-11 22:04:50

0

使用正则表达式:

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

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