2

我对 Ruby 还是有点陌生​​,我有点卡住了。我需要从字符串的末尾获取一个数字。假设我有字符串“potato85”,我需要 85。数字中的位数可能会有所不同,就像它可能是“potato8” - “potato8585”。有什么办法可以拆分字符串并获取第一部分和数字?

4

4 回答 4

14

使用 String#scan 方法

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

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

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

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

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

于 2012-08-28T11:30:49.103 回答
4

这是一种方法:

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

但是您可能想使用正则表达式。

于 2012-08-28T11:29:34.643 回答
1

我会在这里使用带有 .match() 的正则表达式:http ://www.ruby-doc.org/core-1.9.3/Regexp.html

于 2012-08-28T11:27:58.897 回答
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 个或多个数字。

于 2012-08-28T11:35:37.167 回答