用于从地址字符串捕获城市状态邮政编码的正则表达式



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

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

我目前有以下模式。

[,].*

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

有没有办法在逗号之前捕获字符串 [City],这也适用于 City 是 2 个单词的情况(即洛杉矶)。

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

此正则表达式分别捕获组 1、2 和 3 中的城市、州和 zip:

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

观看现场演示。

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

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

它与此相匹配

Gfdsdf Gfdsf, CA 43534

这是细分

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

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

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

s? - 后跟一个可选空格

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

,s - 紧跟逗号和空格

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

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

-?d{4}? - 可选匹配 zip+4 格式。这不是必需的

仅给定您的语料库,该语料库始终具有套房/公寓编号,您可以使用:

$ 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 个字段的行),然后盯着希望很小的余数。

我相信

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

(\d*)\s+((?:[\w+\s*-])+)[\,]\s+

([a-zA-Z]+)\s+([0-9a-zA-Z]+)

第1组:公寓/门牌号

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

第 3 组:州/省代码

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

这将匹配以下所有情况:3333约瑟芬AVE #114特曼库拉,CA 99

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

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

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

11111 MERIT CIR #113 hkjkhuhuh, CAdsdsd T3B2R1

11111 MERIT CIR #113 dsadsa-ddasdas , CAdsdsd T2N21T

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

最新更新