使用正则表达式 PHP 拆分美国的地址


Spliting the address of US using regex PHP

我想将地址拆分为城市,州和邮政编码。

现在使用我当前的正则表达式模式,我已经可以获取邮政编码和州,但我在匹配城市时遇到了问题。

这是我目前的模式

/'s*([^,]+?)'s*((?:'w{2,3}|(AVE))[A-Z]+?(?:'s[A-Z]+)?)'s*('w{2})'s*('d{5}(?:-'d{4})|'d{5}(?:-'s'd{4})?)/

演示 : https://regex101.com/r/kQ2dE7/1

通过上面的演示,我能够正确匹配城市,但这不适用于其他类型的地址。

https://regex101.com/r/kQ2dE7/2

https://regex101.com/r/kQ2dE7/4

我希望第一个捕获组只匹配到一个有数字的单词或一个只有数字的单词或像ST,CT,AVE,DR这样的单词。

例如:

11111 A 湾路 AAA111 阳光岛海滩 FL 33160-4266

11111 A湾路 AAA111

阳光岛海滩

佛罗里达州

33160-4266

第一个匹配组应检查它是否包含"ST"/"CT"/"DR"/"AVE"或带数字的单词。然后它将匹配直到该词。

此外,如果字符串中有两个该单词的实例,则它应该匹配到最远的单词。

例:

111 11TH ST AAAA2 布鲁克林 NY 11209- 4940

111 第11街AAAA2

布鲁克林

纽约

11209- 4940

(在此示例中,ST 和带有数字的单词存在,然后它应该匹配,直到带有数字的单词。

这就是为什么我尝试创建一个条件语句来匹配我的正则表达式模式中的某些单词。如何在正则表达式中实现这一点?

  • 备择AVE在群(?:'w{2,3}|(AVE))中是无用的,因为AVE已经由'w{2,3}匹配。
  • (?:'w{2,3}|(AVE))在第二个捕获组中是无用的 - 它只匹配城市的 2 或 3 个第一个字符; 但是城市名称应该从单词边界开始,所以让我们用 'b 替换这个组。
  • 城市名称的空格分隔的尾随部分可能出现不止一次(如SUNNY ISLES BEACH,因此组(?:'s[A-Z]+)必须具有量词*而不是?
  • ('d{5}(?:-'d{4})|'d{5}(?:-'s'd{4})?)可以简化为 ('d{5}(?:-'s?'d{4})?) .
  • 第一个匹配组应检查它是否包含"ST"/"CT"/ "DR"/"AVE"或带数字的单词。然后它将匹配直到该词。

    此外,如果字符串中有两个该单词的实例,则 应该匹配到最远的单词。

    我认为你的意思是两个或两个以上的实例。第一个捕获组([^,]+'b(?:ST|CT|DR|AVE|'w*'d'w*)'b)将满足这些要求。

上述所有更改都在此处合并到您的正则表达式中:https://regex101.com/r/uY7oM1/4

's*([^,]+'b(?:ST|CT|DR|AVE|'w*'d'w*)'b)'s*('b[A-Z]+?(?:'s[A-Z]+)*)'s*('w{2})'s*('d{5}(?:-'s?'d{4})?)