2010-02-01 196 views
81

提取的最後n個字符從字符串中獲取最後一個字符n,我認爲你可以使用從紅寶石串

ending = string[-n..-1] 

但如果字符串小於n字母長,你會得到nil

什麼解決方法可用?

背景:這些字符串是純ASCII,我有權訪問ruby 1.9.1,並且我使用普通的舊的Ruby對象(沒有web框架)。

回答

81

在這裏你有一個襯墊,你可以把一個大於字符串的大小:

"123".split(//).last(5).to_s 

爲Ruby 1.9+

"123".split(//).last(5).join("").to_s 

爲Ruby 2.0+,加入回報串

"123".split(//).last(5).join 
+14

如果您使用的是最新版本的Ruby,那麼您可以使用「chars」而不是split。 –

+0

這不適用於1.9。其他答案似乎。 – rogerdpack

+1

我用「12345678910」.split(//)。last(7).join.to_s –

13
ending = string.reverse[0...n].reverse 
+0

這是我此頁,滿足了能夠提供一個結束字符長度的要求上看到的最好的方法超過了整個字符串的長度。 –

+0

例如,如果您打算採用「abcde」,「ab」和「a」等一組刺的最後3個字符。這種技術將導致「cde」,「ab」和「a」使用相同的代碼。 >>>「cde」'「ab」.reverse [0,3] .reverse' >>>「ab」'「a」.reverse [0, 3] .reverse' >>>「a」 –

93

嗯,我能想到的最簡單的解決方法是:

ending = str[-n..-1] || str 

(編輯:or運營商具有比分配的優先級低,所以一定要使用||代替。)

+0

+1 ...我認爲這種方式比'string.reverse [0..n] .reverse'更容易閱讀,這給了我一秒鐘的「等待,爲什麼他在做那個?「 (或者如果我不是在這個問題的背景下閱讀它) – Arkaaito

+0

比我的正則表達式更簡單。 – EmFi

+4

好的答案,但它應該是'||'而不是'或',或者將括號放在'str [-n ..- 1]或str'的​​周圍。 –

5

你嘗試過一個正則表達式嗎?

string.match(/(.{0,#{n}}$)/) 
ending=$1 

正則表達式在字符串的結尾捕捉儘可能多的字符就可以了,但不超過N多。並將其存儲在$ 1中。

8

從字符串中獲得最後的n個字符,你可以這樣做

a [-n,n]如果a是數組。

下面是一個例子,如果你想要一個。

紅寶石1.9.2-P180:006>一個= 「911234567890」

=> 「911234567890」

紅寶石1.9.2-P180:009>一個[-5,5]

=> 「67890」

紅寶石1.9.2-P180:010>一個[-7,7-]

=> 「4567890」

+0

如果這個數字太大,返回'nil',這就是這個問題特別想要避免的。 –

+0

很好的答案。清潔。 – Volte

1

展示次數EmFi的答案。

string[/.{,#{n}}\z/m] 
27

在直紅寶石(無Rails的),你可以做

string.chars.last(n).join 

例如:

2.4.1 :009 > a = 'abcdefghij' 
=> "abcdefghij" 
2.4.1 :010 > a.chars.last(5).join 
=> "fghij" 
2.4.1 :011 > a.chars.last(100).join 
=> "abcdefghij" 

如果你使用Ruby on Rails,你可以調用方法firstlast上的一個字符串對象。這些方法是首選,因爲它們簡潔直觀。

例如:

[1] pry(main)> a = 'abcdefg'                             
=> "abcdefg" 
[2] pry(main)> a.first(3)                             
=> "abc" 
[3] pry(main)> a.last(4)                              
=> "defg" 
+0

最好的一個。謝謝。 –

+0

Ruby不暗示Rails。 – Volte

7

您可以使用下面的代碼:

string[string.length-n,string.length] 
+1

代碼 - 答案並不總是有幫助。解釋爲什麼/這個代碼是如何修復會很好 – ry8806