复杂地址的正则表达式

时间:2013-09-02 07:50:43

标签: ruby regex

我正在寻找一种从代表街道地址的字符串中提取街道号码的方法。它必须能够处理"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)*/

用空格和/或&符号/斜线/等覆盖地址......我想

3 个答案:

答案 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