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

要从字符串中获取最后的 n字符,我假定您可以使用

ending = string[-n..-1]

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

有什么解决办法?

背景 : 字符串是普通的 ASCII,我可以访问 Ruby 1.9.1,我使用的是普通的旧 Ruby 对象(没有 web 框架)。

97484 次浏览
ending = string.reverse[0...n].reverse

我能想到的最简单的解决办法是:

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

(EDIT: The or operator has lower precedence than assignment, so be sure to use || instead.)

你试过正则表达式吗?

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

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

这里有一行,你可以写一个大于字符串大小的数字:

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

对于 Ruby 1.9 +

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

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

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

要从字符串中获取最后的 n 个字符,可以这样做

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

如果你想要的话,这里有一个例子。

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”

对 EmFi 解答器的改进。

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

在没有 Rails 的直接 Ruby 中,您可以

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"

如果您正在使用 RubyonRails,那么您可以对一个字符串对象调用方法 firstlast。这些方法是首选的,因为他们是简洁和直观的。

例如:

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

您可以使用以下代码:

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

对于那些正在使用 Ruby on Rails的人,你可以简单地这样做:

str.last(n)

注意: 我意识到这并不能回答 OP 的问题,因为在 PLAIN Ruby (w/o Rails)中,last方法对于 String并不存在。对于这个问题,还有许多其他好的答案。