如何从字符串的末尾获取数字

时间:2012-08-28 11:23:45

标签: ruby-on-rails ruby

我仍然是Ruby的新手,我有点卡住了。 我需要从字符串的末尾得到一个数字。 让我们说我有字符串“potato85”,我需要85。 数字的位数可以变化,就像它可能是“potato8” - “potato8585”。 有什么方法可以分割字符串并得到第一部分和数字吗?

4 个答案:

答案 0 :(得分:14)

使用String#scan方法

您可以使用String#scan方法。例如:

my_string = 'potato8585'
my_string.scan( /\d+$/ ).first
# => "8585"

my_string = 'potato8'
my_string.scan( /\d+$/ ).first
# => "8"

此方法将字符串中的所有可能匹配读取到数组中,但$锚点将确保只有一个元素。然后,只需弹出数组中的第一个元素即可返回一个字符串。

还有其他方法可以做到这一点,但这对我来说似乎是最简单的解决方案。 YMMV。

答案 1 :(得分:4)

这是一种方法:

"potato85".reverse.to_i.to_s.reverse.to_i # => 85

但你可能想要使用正则表达式。

答案 2 :(得分:1)

我会在.match()中使用正则表达式更多信息:http://www.ruby-doc.org/core-1.9.3/Regexp.html

答案 3 :(得分:1)

使用一点正则表达式可以满足您的需求。看看这个:

[1] pry(main)> r = /(.*?)(\d+)$/
=> /(.*?)(\d+)$/
[2] pry(main)> m = r.match "potato8"
=> #<MatchData "potato8" "potato" "8">
[3] pry(main)> m = r.match "potato85"
=> #<MatchData "potato85" "potato" "85">
[4] pry(main)> m = r.match "potato8585"
=> #<MatchData "potato8585" "potato" "8585">
[5] pry(main)> m = r.match "p0t4to8585"
=> #<MatchData "p0t4to8585" "p0t4to" "8585">
[6] pry(main)> m[1]
=> "p0t4to"
[7] pry(main)> m[2].to_i
=> 8585

所以(.*?)非贪婪地匹配任意数量的任何字符,然后(\d+)$匹配字符串末尾的1位或更多位数。