我有一段包含以下地址的文字:
我希望将地址编号中的每个地址与“街道类型”(街道,街道,道路,道路,道路等)匹配,但地址以该字开头的。
上面的地址,语句将匹配:
900 Greenwood St. 500街的主街 670 W. Townline Ave. 1234 River Avenue
并且不匹配:
1125 Main Ave。
答案 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))$
(?!^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 );
}
未测试。