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

Ruby 使用正则表达式获取最后的数字,ruby,regex,Ruby,Regex,我有一个字符串: 10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES 我想从字符串中获取此值: 136185 我试图使用/([^\/]*)$/,但它返回: 136185RAMADA HOTEL 我该怎么办?试试看 string[/.*\b(\d+)/,1] 这将在匹配一组数字之前匹配尽可能多的字符,从单词边界开始,以确保贪婪的*不会占用数字组的开头 或使用 string.sca

我有一个字符串:

10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES 
我想从字符串中获取此值:

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

136185RAMADA HOTEL  
我该怎么办?

试试看

string[/.*\b(\d+)/,1]
这将在匹配一组数字之前匹配尽可能多的字符,从单词边界开始,以确保贪婪的
*
不会占用数字组的开头

或使用

string.scan(/\d+/).last
更具可读性,但不是纯正则表达式。

试试看

string[/.*\b(\d+)/,1]
str = "10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES"

str[/\d+(?=\D*\z)/]
# => "136185"
这将在匹配一组数字之前匹配尽可能多的字符,从单词边界开始,以确保贪婪的
*
不会占用数字组的开头

或使用

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

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

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

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

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

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

str[/\d+(?=\D*\z)/]
# => "136185"
'10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES'.split[6].split('/').last[0, 6]
=> "136185"

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

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

任何正则表达式解决方案的潜在问题是,如果酒店的名称类似于
7 Seas
,使用
scan
的相反方法是使用
split
,则使用
\d+
的解决方案可能会返回错误的值:

    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

请注意,“七海酒店”仍然会导致问题

使用
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

请注意,“七海酒店”仍然会导致问题

部分选择第一个匹配组。我猜网站会向你展示完整的比赛,而不仅仅是小组赛。请使用我提供的完整表达式使用
irb
重试。
[…,1]
部分选择第一个匹配组。我猜网站会向你展示完整的比赛,而不仅仅是小组赛。请使用我提供的完整表达式使用
irb
再试一次。您应该下载测试正则表达式的伟大程序。这个答案有效:)您应该下载测试正则表达式的伟大程序。这个答案有效:)这个数字总是六位数吗?如果短一点,酒店名称是“7海”,会发生什么?这个数字总是六位数吗?如果更短,酒店名称为“7海”,会发生什么?