我正在寻找一种从代表街道地址的字符串中提取街道号码的方法。它必须能够处理"7 & 14 Sample Street"
中的多个号码以及"221b Baker street"
中带字母的街道号码,当然还有公寓。
E.g。
street_address = "123 & 221b Baker Street"
返回:
street_number = "123 & 221b"
和
street_address = "123/345 Sample Street"
返回:
street_number = "123/345"
基本上我需要一个快速的方法来从地址中提取街道号码,即使该地址比常规的“123 Sample Street”类型地址更复杂。
正则表达式是否可以在字符串中的最后一个数字后找到第一个空格?并返回那个空间之前的一切?这似乎是我能想到的最直接的方式。
编辑: 谢谢大家的帮助。我想我已经成功地处理了所有地址:
/\w+(\s?\S{1,3}\s)*/
用空格和/或&符号/斜线/等覆盖地址......我想
答案 0 :(得分:1)
所以,问题是在最后一个数字之后的第一个空格,这就是所谓的lookbehind。
不幸的是,你要求的是一个可变长度 lookbehind,大多数Regex引擎都不支持,所以最好的办法是捕获整个正则表达式的数字,然后检查长度,如:
s = "123 & 221b Baker Street"
/(^\w+(?:\s\&\s\w+)*)/.match { |m| m[1].try(:length).to_i }
# => 10
s[10..-1]
# => " Baker Street"
注意我在这个答案中使用了Object#try
,这是一个Rails Core扩展。
答案 1 :(得分:0)
怎么样:
^(.*\d\S*)\s+.*$
街道号码在第1组。
答案 2 :(得分:0)
试试这个正则表达式/\w+(\s\&\s\w+)*/
s = "123 & 221b Baker Street"
s[/\w+(\s\&\s\w+)*/]
# => "123 & 221b"
s = "7 & 14 Sample Street"
s[/\w+(\s\&\s\w+)*/]
# => "7 & 14"
s = "221b Baker street"
s[/\w+(\s\&\s\w+)*/]
# => "221b"
注意:如果数字之间的空格可能存在或不存在,您可以在*
之后加\s
。