将地址编号中的每个地址与“街道类型”匹配

时间:2011-07-01 00:13:36

标签: javascript regex

我有一段包含以下地址的文字:

  • at 900 Greenwood St。
  • 在大街500街区
  • at 670 W. Townline Ave。
  • 在1234 River Avenue之前
  • 1125 Main Ave。

我希望将地址编号中的每个地址与“街道类型”(街道,街道,道路,道路,道路等)匹配,但地址以该字开头的。

上面的地址,语句将匹配:

900 Greenwood St. 500街的主街 670 W. Townline Ave. 1234 River Avenue

并且不匹配:

1125 Main Ave。

4 个答案:

答案 0 :(得分:2)

据我所知,这种复杂的任务没有一个简单的正则表达式模式。要使一种模式可靠地工作,需要覆盖太多变量。我的第一个猜测是寻找“街道”,“大道”等,但如果街道名称没有后缀(即999 La Canada)怎么办?您可以查找“at”,“in”或“before”之间的任何短语,但如果其中一个短语不是地址呢?明白我的意思?

我的建议是看一下Perua的Lingua :: EN :: AddressParse。

答案 1 :(得分:1)

s = "at 900 Greenwood St.\n\
in 500 block of Main Street\n\
at 670 W. Townline Ave.\n\
before 1234 River Avenue\n\
of 1125 Main Ave."

正则表达式

/(?:^|\s)(?:(?!of\b)[a-z]+)\s*(\d[\s\S]*?\b(?:ave\.|avenue|st\.|street|lane|road|rd\.))/gi

因此使用

var addresses = [];
for (var match = [], re = /(?:^|\s)(?:(?!of\b)[a-z]+)\s*(\d[\s\S]*?\b(?:ave\.|avenue|st\.|street|lane|road|rd\.))/gi;
     match = re.exec(s);) {
  addresses.push(match[1]);
}

产生

["900 Greenwood St.","500 block of Main Street","670 W. Townline Ave.","1234 River Avenue"]

答案 2 :(得分:1)

这符合您的要求:

(?!^of\b)^.*?(\d+.*?(?:St\.|Street|Ave\.|Avenue))$

here on Regexr

(?!^of\b)负向前看,行不以“of”开头

^匹配行的开头,使用m修饰符!

.*?匹配非贪婪的一切

(\d+.*?找到第一个数字后,使用(

启动第一个捕获组

(?:St\.|Street|Ave\.|Avenue))由于?:的非捕获组与|之间的替换匹配。最后一个)用结果关闭捕获组。

$匹配行的结尾,使用m修饰符!

您的结果位于第一个捕获组中。

重要这适用于您提供的示例,地址可能不同,它不适用于所有类型的现有地址。

答案 3 :(得分:0)

var addrs = create_array_of_possible_addresses();
var matching_addrs = [];
for (var i=0; i < addrs.length; i++) {
    if ( addrs[i].match(/^of/) continue;
    if ( addrs[i].match((/\d.*(?:St\.?|Street|Ave\.?|Avenue|Ln\.?|Rd\.?|Road))/ )
        matching_addrs.push( RegExp.$1 );
}

未测试。