Javascript 将地址编号中的每个地址与';街道类型';
我有一段文字包含以下地址:Javascript 将地址编号中的每个地址与';街道类型';,javascript,regex,Javascript,Regex,我有一段文字包含以下地址: 格林伍德街900号 在主街500街区 在汤林大道西670号 河大道1234号前 主大街1125号的 我想将每个地址从地址号匹配到“街道类型”(大街、街道、巷、路、路等),但以单词of开头的地址除外 因此,在上述地址中,声明将匹配: 格林伍德街900号。 大街500号街区 汤林大道西670号。 河流大道1234号 而且不匹配: 主大街1125号var addrs=创建一个可能地址的数组(); var addrs = create_array_of_possible_
- 格林伍德街900号
- 在主街500街区
- 在汤林大道西670号
- 河大道1234号前
- 主大街1125号的
var addrs=创建一个可能地址的数组();
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 );
}
var匹配_addrs=[];
对于(变量i=0;i
未测试。var addrs=创建一个包含可能地址的数组();
var匹配_addrs=[];
对于(变量i=0;i
未经测试。据我所知,对于这种复杂的任务,没有一个简单的正则表达式模式。有太多的变量,一个模式无法可靠工作。我的第一个猜测是查找“street”、“ave”等,但如果street名称没有后缀(即999 La Canada),该怎么办你可以在“at”、“in”或“before”之间查找任何短语,但如果其中一个短语不是地址呢?明白我的意思吗
我的建议是看看Lingua::EN::AddressParse for Perl。据我所知,对于这种复杂的任务,没有一个简单的正则表达式模式。有太多的变量,一个模式无法可靠地工作。我的第一个猜测是查找“street”、“ave”,等等,但如果街道名称没有后缀(即999 La Canada),该怎么办?您可以查找“at”、“in”或“before”之间的任何短语,但如果其中一个短语不是地址,该怎么办?明白我的意思吗 我的建议是看看Lingua::EN::AddressParse for Perl。什么时候
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"]
什么时候
正则表达式
/(?:^|\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"]
这符合您的要求:
(?!^of\b)^.*?(\d+.*?(?:St\.|Street|Ave\.|Avenue))$
看到了吗
(?!^of\b)
负面展望,行不以“of”开头
^
匹配行的开头,使用m
修饰符
*?
匹配所有非贪婪的内容
(\d+.*?
找到第一个数字后,使用(
(?:St\.| Street | Ave\.| Avenue))
未捕获组,因为?:
匹配|
之间的交替。最后一个)
关闭捕获组并显示结果
$
匹配行尾,使用m
修饰符
您的结果在第一个捕获组中
重要信息这适用于您给定的示例,地址可能会有很大的不同,它不会适用于所有类型的现有地址。这满足了您的要求:
(?!^of\b)^.*?(\d+.*?(?:St\.|Street|Ave\.|Avenue))$
看到了吗
(?!^of\b)
负面展望,行不以“of”开头
^
匹配行的开头,使用m
修饰符
*?
匹配所有非贪婪的内容
(\d+.*?
找到第一个数字后,使用(
(?:St\.| Street | Ave\.| Avenue))
未捕获组,因为?:
匹配|
之间的交替。最后一个)
关闭捕获组并显示结果
$
匹配行尾,使用m
修饰符
您的结果在第一个捕获组中
重要信息这适用于您给定的示例,地址可能会如此不同,它不会适用于所有类型的现有地址。段落中是否有不属于地址的数字?这看起来像是家庭作业。是吗?即使应用下面的某个正则表达式,您也要确认它已被解析正确。我在地址验证行业(SmartyStreets)工作,这是一项常见的任务——因此,为了确保您拥有准确的数据,您需要根据USPS识别的地址对其进行测试。例如,查看LiveAddress(它是免费的)。希望能有所帮助。这段文字中是否有不属于地址的数字?这看起来像是家庭作业。是吗?即使应用了下面的某个正则表达式,您也会希望确认其解析正确。我在地址验证行业(SmartyStreets)工作如果这是一项常见任务,那么为了确保数据准确,您需要根据USPS识别的地址对其进行测试。例如,查看LiveAddress(它是免费的)。希望能有所帮助。@Brock Adams,\w匹配[0-9],使其接受部分数字。这一点现在已修复。@Brock Adams,\w匹配[0-9]这使得它接受了部分数字,这是固定的。