我正在尝试编写一个正则表达式语句,该语句仅匹配地址的城市,州和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