我有一个字符串:
10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES
我想从字符串中获取这个值:
136185
我尝试使用/([^\/]*)$/
,但它返回:
136185RAMADA HOTEL
我应该怎么办?
使用的反面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”仍然会引起问题
str = "10 101/12/201209/12/2012 8 75.00 600.00 2 1RPT/136185RAMADA HOTEL & SUITES"
str[/\d+(?=\D*\z)/]
# => "136185"
我不知道这是否是最短的解决方案,但(\d+)\D*\Z
应该可以。
如果号码总是六位数,请使用:
'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
.
尝试
string[/.*\b(\d+)/,1]
这在匹配一组数字之前匹配尽可能多的字符,从单词边界开始以确保贪婪.*
不会吃掉数字组的开头。
或使用
string.scan(/\d+/).last
这更具可读性,但不是纯正则表达式。