如何编写正则表达式将地址字符串按街道城市邮编正确分组
正则匹配方案
原正则失效原因
你编写的正则^(.*)(?: City: *(.*))?(?: ZIP: *(.*))?$失效的核心原因是第一个分组用了贪婪匹配的(.*):它会优先匹配尽可能长的字符串,哪怕后续存在City:、ZIP:标记,也会被吞入第一个分组,导致后两个分组永远无法捕获到值。
可用正则表达式
^(.*?)(?:\s*City:\s*(.*?))?(?:\s*ZIP:\s*(.*))?\s*$
分组规则说明
- 第一个分组
(.*?):非贪婪匹配街道地址,只要后面出现City:、ZIP:标记或者字符串结束就停止匹配,无街道时返回空值 - 第二个分组
(.*?):匹配City:标记后的城市内容,无城市时返回空值 - 第三个分组
(.*):匹配ZIP:标记后的邮编内容,无邮编时返回空值 - 正则中的
\s*用于兼容标记前后可能存在的多余空格,若你的输入不存在多余空格可自行删除
测试验证结果
针对你给出的8条示例输入,匹配结果完全符合预期:
- 输入
01_foo_street City: bar_city ZIP: baz:分组1=01_foo_street,分组2=bar_city,分组3=baz - 输入
City: bar_city ZIP: baz:分组1=``,分组2=bar_city,分组3=baz - 输入
01_foo_street ZIP: baz:分组1=01_foo_street,分组2=``,分组3=baz - 输入
ZIP: baz:分组1=,分组2=,分组3=baz - 输入
01_foo_street City: bar_city:分组1=01_foo_street,分组2=bar_city,分组3=`` - 输入
City: bar_city:分组1=,分组2=`bar_city`,分组3= - 输入
01_foo_street:分组1=01_foo_street,分组2=,分组3= - 输入空字符串:分组1=
,分组2=,分组3=``
内容的提问来源于stack exchange,提问作者Salman Arshad
相关产品推荐
相关产品推荐

