如何调整地址正则表达式,使其可匹配任意顺序的地址格式?
正则调整方案
核心思路是用分支匹配符|同时兼容两种地址排序规则,把原有的「门牌号+街道+邮编+城市」作为第一个匹配分支,新增「邮编+城市+门牌号+街道」作为第二个匹配分支即可。
调整后的基础版正则如下,原有捕获组逻辑完全兼容:
(?:([0-9-]*) ?([\p{L}*,\. '-]*) ?([0-9 ]*) ?([\p{L}*,\. '-]*) ([0-9]{5}) ?([\p{L}*,\. '-]*)|([0-9]{5}) ?([\p{L}*,\. '-]*) ([0-9-]*) ?([\p{L}*,\. '-]*) ?([0-9 ]*) ?([\p{L}*,\. '-]*))
如果需要两种地址顺序下,同一类地址片段都落在同一个捕获组里,推荐使用命名捕获组,后续提取内容更方便:
(?: (?<门牌号>[0-9-]*) ?(?<街道段1>[\p{L}*,\. '-]*) ?(?<街道数字补充>[0-9 ]*) ?(?<街道段2>[\p{L}*,\. '-]*) (?<邮编>[0-9]{5}) ?(?<城市>[\p{L}*,\. '-]*) | (?<邮编>[0-9]{5}) ?(?<城市>[\p{L}*,\. '-]*) (?<门牌号>[0-9-]*) ?(?<街道段1>[\p{L}*,\. '-]*) ?(?<街道数字补充>[0-9 ]*) ?(?<街道段2>[\p{L}*,\. '-]*) )
匹配效果验证
- 正序地址
16 Rue du Pont Louis-Philippe 75000 Paris:可正常捕获所有字段,和原有正则效果完全一致 - 倒序地址
75000 Paris 16 Rue du Pont Louis-Philippe:可正常捕获对应字段,不会出现匹配失败的情况
内容的提问来源于stack exchange,提问作者Gano
相关产品推荐
相关产品推荐

