【问题标题】:Regex for capturing City State Zip from an Address String用于从地址字符串中捕获 City State Zip 的正则表达式
【发布时间】:2016-03-03 23:14:18
【问题描述】:

我正在尝试编写一个仅匹配地址的城市、州和邮编部分的正则表达式语句。以下是我正在使用的地址的一些示例。

3333 Josephine AVE #114 Temecula, CA 99999
11111 MERIT CIR #113 Laguna Hills, CA 99999

我目前有以下模式。

[\,].*

但这仅捕获通过逗号分隔城市和州的所有内容。

有没有办法在逗号前捕获字符串 [City],这也适用于 City 是 2 个单词的情况(例如 Los Angeles)。

任何帮助将不胜感激!提前致谢。

【问题讨论】:

  • 不可靠,不。当您有不规则或不良数据时,没有捷径可走。最好以 CSV 或某种可解析格式重新生成数据。

标签: regex


【解决方案1】:

此正则表达式分别捕获第 1、2 和 3 组中的城市、州和邮政编码:

#\d+ ([^,]+), ([A-Z]{2}) (\d{5})

live demo

【讨论】:

  • 那个演示很棒。这次真是万分感谢。我花了太多时间试图找出我需要的地址解析。
【解决方案2】:

很难在正则表达式中捕获确切的状态,或者说它会是一个非常长的正则表达式。但是,我确实对其进行了测试,这就是我想出的

/([A-Z][a-z]+\s?)+,\s[A-Z]{2}\s\d{5}-?\d{4}?/

它符合这个

Gfdsdf Gfdsf, CA 43534

下面是详细介绍

() - 捕获包含的正则表达式

[A-Z]- 查找所有大写字母。

[a-z]+ - 后跟一个或多个小写字母

\s? - 后跟一个可选空格

+ - 这允许我们在城市名称中包含多个单词

,\s - 后面紧跟一个逗号和一个空格

[A-Z]{2} - 各州的 ISO 代码是两个字母。显然,在这个简单的示例中,它会包含虚假状态,但否则正则表达式会太长。

\d{5} - 以五位数的邮政编码结尾。

-?\d{4}? - 可选地匹配 zip+4 格式。不需要

【讨论】:

  • ZIP+4 怎么样? :)
  • 我不知道这是什么意思
  • 这是一种标准的美国格式,例如 12345-6789。并不是您的解决方案是错误的,而是 OP 的语料库确实有限,不能代表真实世界的数据。整个事情都是一个 X/Y 问题。
  • 明白。向这个正则表达式添加条件很容易
【解决方案3】:

只考虑你的语料库,它总是有一个套房/公寓号码,你可以这样做:

$ echo '3333 Josephine AVE #114 Temecula, CA 99999
11111 MERIT CIR #113 Laguna Hills, CA 99999' |
pcregrep -o '#\d+ \K.*'
Temecula, CA 99999
Laguna Hills, CA 99999

但是,如果您有不规则的数据,并且不是像 CSV 这样定义明确的格式,您就会遇到问题。例如,街道名称中有两个或多个单词的地址,或者没有公寓号码的地址呢?

真正的解决方案是使用 CSV 等标准化格式重新生成数据。如果您不能这样做,则只解析符合要求的数据(例如,具有 7 个字段的行),然后关注希望很小的剩余部分。

【讨论】:

    【解决方案4】:

    我相信有更好的方法可以做到这一点,但你可以尝试使用这个:

    (\d*)\s+((?:[\w+\s*-])+)[\,]\s+([a-zA-Z]+)\s+([0-9a-zA -Z]+)

    第一组:Apt/门牌号

    第 2 组:城市(可以有多个空格、下划线和破折号)

    第 3 组:州/省代码

    第 4 组:邮政编码(可以由字母和数字组成)

    这将匹配以下所有情况: 约瑟芬大道 3333 号 #114 特曼库拉,加利福尼亚州 99

    11111 MERIT CIR #113 Laguna Hills, CA 99999

    11111 MERIT CIR #113 ddwwqs 拉古纳山,CA 99999

    11111 MERIT CIR #113 sss ssss sss xs, CA 99999

    11111 MERIT CIR #113 hkjkhuhuh, CAdsdsd T3B2R1

    11111 优点 CIR #113 dsadsa-ddasdas , CAdsdsd T2N21T

    在此处查看演示:http://www.regexr.com/3cuds

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-10
      • 2019-10-12
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多