【问题标题】:Spliting the address of US using regex PHP使用正则表达式 PHP 拆分美国的地址
【发布时间】:2016-02-22 10:10:00
【问题描述】:

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

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

这是我目前的模式

/\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 BAY RD AAA111 SUNNY ISLES BEACH FL 33160-4266

11111 A BAY RD AAA111

阳光岛海滩

FL

33160-4266

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

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

例子:

111 11TH ST AAAA2 BROOKLYN NY 11209- 4940

111 街 AAAA2

布鲁克林

纽约

11209-4940

(在这个例子中,ST 和一个带有数字的单词存在,那么它应该匹配直到带有数字的单词。)

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

【问题讨论】:

  • 这是徒劳的,尤其是在您接受用户输入的情况下。如果您可以更清楚地说明所需的正则表达式,可能有人可以想出一个,但它永远不会可靠地工作。排列太多了。

标签: php regex preg-match-all


【解决方案1】:
  • 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})?)

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多