2010-02-01 154 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