Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将地址编号中的每个地址与';街道类型';_Javascript_Regex - Fatal编程技术网

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号的
我想将每个地址从地址号匹配到“街道类型”(大街、街道、巷、路、路等),但以单词of开头的地址除外

因此,在上述地址中,声明将匹配:

格林伍德街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]这使得它接受了部分数字,这是固定的。