从红宝石字符串中提取最后n个字符


105

为了获得n字符串中的最后一个字符,我假设您可以使用

ending = string[-n..-1]

但是如果字符串的长度小于n字母长度,您将得到nil

有哪些解决方法?

背景:字符串为纯ASCII,并且我可以访问ruby 1.9.1,并且使用的是Plain Old Ruby Objects(无Web框架)。

Answers:


99

在这里,您有一个衬板,可以放置一个大于字符串大小的数字:

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

对于红宝石1.9+

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

对于ruby 2.0 +,join返回一个字符串

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

19
如果您使用的是Ruby的最新版本,则可以使用chars而不是split。
安德鲁·格林

1
我使用了“ 12345678910” .split(//)。last(7).join.to_s
沸腾的仙境

@ Hard-BoiledWonderland join作品。to_s如果您使用join,我认为您不需要最后一个。
Andrew Grimm

@AndrewGrimm是的,在这种情况下,我将上述内容与Nokogiri一起使用,n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_i我需要使用to_s来执行to_i以提取数值。
沸腾的仙境

您缺少.join-现在它返回一个字符串数组。相反,它应该是"123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov

115

好吧,我能想到的最简单的解决方法是:

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

(编辑:or运算符的优先级比分配的优先级低,因此请务必使用||。)


+1 ...我认为这种方式比起来更容易阅读string.reverse[0..n].reverse,这给了我第二个“等待,他为什么这样做?” (或者如果我不在这个问题的背景下阅读它的话)
Arkaaito 2010年

4
好的答案,但是应该||代替or或在括号中加上str[-n..-1] or str
Andrew Grimm'2

好的答案,但是我不喜欢红宝石不会像x [0..inf]一样对待s [-inf ..- 1]
klochner 2010年

感谢您注意到运算符优先级问题,Andrew。每次都会得到我。
perimosocordiae

@perimosocordiae您不是唯一的一个。stackoverflow.com/questions/372652/…–
安德鲁·格林

51

在纯Ruby(没有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"

1
Ruby并不暗示Rails。
Volte

14
ending = string.reverse[0...n].reverse

这是我在此页面上看到的最好的方法,它满足了能够提供超过总字符串长度的结尾字符长度的要求。
Rob.Kachmar,2013年

1
例如,如果您打算采用一组字符串(例如“ abcde”,“ ab”和“ a”)的最后3个字符。此技术将导致“ cde”,“ ab”和“ a”使用相同的代码。 "abcde".reverse[0,3].reverse>>>“ cde” "ab".reverse[0,3].reverse>>>“ ab” "a".reverse[0,3].reverse>>>“ a”
Rob.Kachmar

9

您可以使用以下代码:

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

1
仅代码-答案并不总是有用。解释为什么/如何修复此代码将非常
有用

6

要从字符串中获取最后n个字符,可以执行此操作

a [-n,n]如果a是数组。

这是示例,如果您想要一个。

ruby-1.9.2-p180:006> a =“ 911234567890”

=>“ 911234567890”

ruby-1.9.2-p180:009> a [-5,5]

=>“ 67890”

ruby-1.9.2-p180:010> a [-7,7]

=>“ 4567890”


如果数字太大,nil则返回该问题专门试图避免的问题。
安德鲁·格林

好答案。清洁。
Volte

为什么要投票?它具有与OP要求的解决方法完全相同的问题。
jeffdill2 '19

5

您是否尝试过正则表达式?

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

regex可以在字符串的末尾捕获尽可能多的字符,但不能超过n。并将其存储在$ 1中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.