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

时间:2016-03-03 23:14:18

标签: regex

我试图写一个只匹配地址的City,State和Zip部分的正则表达式语句。以下是我正在使用的地址的一些示例。

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

我目前有以下模式。

[\,].*

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

请参阅live demo

答案 1 :(得分:2)

很难在Regex中捕获精确的状态,或者说它将是一个非常长的正则表达式。但是,我确实测试了它,这就是我想出来的

/([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格式。这不是必需的

答案 2 :(得分:1)

鉴于你的语料库总是有套房/公寓号,你可以用:

$ 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个字段的行),然后眼球看好希望的小余数。

答案 3 :(得分:1)

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

(\ d *)\ S +((?:[\ W + \ S * - ])+)[\,] \ S +([A-ZA-Z] +)\ S +([0-9A-ZA -Z] +)

第1组:Apt /门牌号

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

第3组:州/省代码

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

这将符合以下所有情况: 3333 Josephine AVE#114 Temecula,CA 99

11111 MERIT CIR#113 Laguna Hills,CA 99999

11111 MERIT CIR#113 ddwwqs Laguna Hills,CA 99999

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

11111 MERIT CIR#113 hkjkhuhuh,CAdsdsd T3B2R1

11111 MERIT CIR#113 dsadsa-ddasdas,CAdsdsd T2N21T

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