Ruby on rails 如何从字符串末尾获取数字

Ruby on rails 如何从字符串末尾获取数字,ruby-on-rails,ruby,Ruby On Rails,Ruby,我对Ruby还是有点陌生,有点卡住了。 我需要从字符串的末尾得到一个数字。 假设我有字符串“potato85”,我需要85。 数字中的位数可能会有所不同,就像它可能是“potato8”-“potato8585”。 有什么方法可以拆分字符串并获取第一部分和数字吗?我会使用正则表达式和.match()在这里进行更多操作:这里有一种方法: "potato85".reverse.to_i.to_s.reverse.to_i # => 85 但是您可能需要使用正则表达式。使用字符串扫描方法 你可以

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

我会使用正则表达式和.match()在这里进行更多操作:

这里有一种方法:

"potato85".reverse.to_i.to_s.reverse.to_i # => 85
但是您可能需要使用正则表达式。

使用字符串扫描方法 你可以使用这个方法。例如:

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

my_string = 'potato8'
my_string.scan( /\d+$/ ).first
# => "8"
此方法将字符串中所有可能的匹配项读取到数组中,但
$
锚定将确保只有一个元素。然后,从数组中弹出第一个元素以返回字符串


有其他方法可以做到这一点,但这似乎是最简单的解决办法。YMMV.

使用一个小正则表达式将得到您所需要的。看看这个:

[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
[1]pry(main)>r=/(.*)(\d+)$/
=>/(.*)(\d+)$/
[2] 撬(主)>m=r。匹配“potato8”
=> #
[3] 撬(主)>m=r。匹配“potato85”
=> #
[4] 撬(主)>m=r。匹配“potato8585”
=> #
[5] 撬(主)>m=r。匹配“p0t4to8585”
=> #
[6] 撬(主)>m[1]
=>“p0t4to”
[7] 撬(主)>m[2]。至_i
=> 8585

因此,
(.*)
不贪婪地匹配任意数量的字符,
(\d+)$
然后匹配字符串末尾的一个或多个数字。

这也非常好,比反转更优雅。感谢您的快速回复。
“ab23\ncd42”。扫描(/\d+$/)。首先是23<代码>“ab23\ncd42”。扫描(/\d+\z/)。第一个
是42。@undur\u或是。如果您要使用多行字符串,那么
\z
表示“字符串结束”,而
$
表示“行结束”。这可能对大多数用例来说很重要,也可能不重要,当然对提供的语料库来说也不重要,但这是一个重要的区别。虽然我的答案涉及原始语料库,但根据数据的输入特征,可以随意替换锚--或者,如果您不希望数组元素是第一个(或唯一一个)匹配项,可以使用数组#last。@undur#u gongor
“abc123 def456\nghi789”。scan(/\d+\b/)
是一个更通用的匹配项,但在本例中,它将返回一个包含三个元素的数组。任何正则表达式的问题在于,您必须充分了解您的数据,才能知道需要哪些锚,以及需要提取哪些元素。这就是OP提供的语料库对正则表达式问题如此重要的原因。YMMV.@CodeGnome:我认为当您想匹配字符串的结尾时,应该始终使用
\z
。使用
$
仅仅因为在本例中,行尾恰好是字符串的结尾,这是一个等待发生的意外。