如何从字符串中获取最后一个正整数?

时间:2014-10-23 23:42:49

标签: ruby regex string

我想使用正则表达式从字符串中提取最后出现的正整数。例如:

  • get-last-01-number-9.test应该返回9
  • get-last-01-number7应该返回7

如何使用正则表达式完成此操作?

5 个答案:

答案 0 :(得分:2)

你可以尝试

(\d+)\D*$

说明:

(\d+) # a number
\D*   # any amount of non-numbers
$     # end of string

这将捕获第一个捕获组中的数字。

答案 1 :(得分:2)

使用否定前瞻

使用贪婪匹配找到一个正整数,后面跟着另一个正整数,如:

/\d+(?!.*\d+)/

例如:

'get-last-01-number-9.test'.match /\d+(?!.*\d+)/
 #=> #<MatchData "9">

'get-last-01-number7'.match /\d+(?!.*\d+)/
#=> #<MatchData "7">

'get-last-01-number-202.test'.match /\d+(?!.*\d+)/
#=> #<MatchData "202">

'get-last-number'.match /\d+(?!.*\d+)/
#=> nil

如果你有一个大的文本blob,这可能比扫描慢,但是有些人可能仍然觉得前瞻断言很有用,特别是对于较短的字符串。

使用扫描

更直接的方法是用String#scan提取所有整数(如果有的话),然后弹出最后一个。例如:

'get-last-01-number-9.test'.scan(/\d+/).pop
#=> "9"

'get-last-01-number7'.scan(/\d+/).pop
#=> "7"

'get-last-01-number-202.test'.scan(/\d+/).pop
#=> "202"

'get-last-number'.scan(/\d+/).pop
#=> nil

答案范围

负整数不是最初发布的问题的一部分,因此不会在此处解决。如果负整数对于将来的访问者来说是一个问题,并且如果在Stack Overflow上没有提出问题,请另外询问有关它们的问题。

答案 2 :(得分:1)

使用此表达式查找1+位数字后面只有非数字,直到字符串结尾(即最后一组数字):

\d+(?=\D*$)

Demo

答案 3 :(得分:0)

这种模式可能效率最高:

.*(\d+)

取决于最后一位数到字符串结尾之后的字符数

Demo

答案 4 :(得分:0)

["get-last-01-number-9.test", "get-last-01-number7"].each do |e|
    e.match(%r{\-number([\-\d]+)}) do |m|
      last_no = m[1].gsub(%r{\-}, "")
      puts "last_no:#{last_no} ---- #{File.basename __FILE__}:#{__LINE__}"
    end
end

# last_no:9 ---- ex.rb:4
# last_no:7 ---- ex.rb:4