我想使用正则表达式从字符串中提取最后出现的正整数。例如:
get-last-01-number-9.test
应该返回9
get-last-01-number7
应该返回7
如何使用正则表达式完成此操作?
答案 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)
答案 3 :(得分:0)
答案 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