我试图写一个只匹配地址的City,State和Zip部分的正则表达式语句。以下是我正在使用的地址的一些示例。
3333 Josephine AVE #114 Temecula, CA 99999
11111 MERIT CIR #113 Laguna Hills, CA 99999
我目前有以下模式。
[\,].*
但是这只捕获了通过分隔城市和州的逗号的所有内容。
有没有办法在逗号之前捕捉字符串[City],这也适用于City为2个单词的情况(即洛杉矶)。
任何帮助将不胜感激!提前谢谢。
答案 0 :(得分:3)
答案 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)
我确信有更好的方法可以做到这一点但你可以尝试使用它:
第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