使用正则表达式获取最后的数字

时间:2013-01-14 23:09:08

标签: ruby regex

我有一个字符串:

10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES 

我想从字符串中获取此值:

136185

我尝试使用/([^\/]*)$/,但它返回了:

136185RAMADA HOTEL  

我该怎么办?

5 个答案:

答案 0 :(得分:1)

str = "10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES"

str[/\d+(?=\D*\z)/]
# => "136185"

答案 1 :(得分:1)

我不知道它是否是最短的解决方案,但(\d+)\D*\Z应该有效。

答案 2 :(得分:1)

使用scan的反面是使用split

    s = '10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES'
    s.split(/\D+/).last # Everything that isn't a number is a separator, take the last one
    => "136185"

如果规则是最后一个'/'之后的第一个数字,那么即使企业名称中有数字,这也有效:

    s = '10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185MOTEL 6'
    s.split(?/).last.to_i # => 136185

请注意,“7 Seas Hotel”仍将导致问题

答案 3 :(得分:0)

尝试

string[/.*\b(\d+)/,1]

在匹配一组数字之前匹配尽可能多的字符,从单词边界开始,以确保贪婪的.*不会占用数字组的开头。

或使用

string.scan(/\d+/).last

更具可读性,但不是纯正则表达式。

答案 4 :(得分:0)

如果数字总是六位数,请使用:

'10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES'.split[6].split('/').last[0, 6]
=> "136185"

任何正则表达式解决方案的潜在问题是,如果酒店名称类似于\d+,则数字+酒店名称可能导致使用7 Seas的解决方案返回错误值。