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

Match each address from the address number to the 'street type'

本文关键字:地址 街道类型 类型 街道 编号      更新时间:2023-09-26

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

  • 在格林伍德街900号。
  • 在主街500街区
  • 在670 W.镇线大道。
  • 1234河大道前
  • 大道1125号。

我想将地址编号中的每个地址与"街道类型"(大道、街道、车道、道路、道路等(相匹配,但以单词开头的地址除外

因此,对于上面的地址,该语句将匹配:

格林伍德街900号主街500街区670 W.镇线大道。1234河大道

并且不匹配:

1125主大道。

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

我的建议是看看 Lingua::EN::AddressParse for Perl。

这是在满足您的请求:

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

在正则表达式上看到它

(?!^of'b) 负面展望未来,行不以单词"of"开头

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

.*?匹配一切非贪婪

('d+.*?找到第一个数字时,第一个捕获组开始(

(?:St'.|Street|Ave'.|Avenue)) 非捕获组,因为?:匹配|之间的交替。最后一个)关闭包含结果的捕获组。

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

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

重要的是,这是与您给定的示例一起使用的,地址可能不同,它不适用于所有类型的现有地址。

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"]
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 );
}

未经测试。