2010-11-17 508 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" 
相關問題