模式匹配部分英国邮政编码

Posted

技术标签:

【中文标题】模式匹配部分英国邮政编码【英文标题】:Pattern match a partial British postcode 【发布时间】:2014-05-29 09:55:24 【问题描述】:

我继承的一个 php 项目中有这种模式。

^(([gG][iI][rR] 0,0[aA]2)|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) 0,[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]2))$

当用于验证完整的英国邮政编码(例如 LE1 1AA)时,它适用于所有实际目的。但是我需要对其进行调整以允许部分邮政编码,如 LE1、SN5 等,其中仅提供第一段。

谁能建议如何进行调整?

【问题讨论】:

【参考方案1】:

这应该可以完成工作

^(([gG][iI][rR] 0,0[aA]2)|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y])))( 0,[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]2)?))$

http://ideone.com/lLg4uD

【讨论】:

【参考方案2】:

首先:

英国邮政编码正确的正则表达式是(或多或少似乎与您的相似,但我没有时间/愿意检查所有可能的情况):

^(([A-Z]\d2[A-Z]2)|([A-Z]\d3[A-Z]2)|([A-Z]2\d2[A-Z]2)|([A-Z]2\d3[A-Z]2)|([A-Z]\d[A-Z]\d[A-Z]2)|([A-Z]2\d[A-Z]\d[A-Z]2)|(GIR0AA))$

According to the geonames' data(英国官方iso code是GB,UK是保留,geocode id:2635167)

总是根据这个数据的格式是:

@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA

IIRC,@ 代表字符,# 代表数字。 因此,要仅检索 GB 邮政编码的第一部分,您的格式将变为:

@#|@##|@@#|@@##|@#@|@@#@|GIR

假设这是你想要实现的部分检查,正则表达式将变为:

^(([A-Z]\d)|([A-Z]\d2)|([A-Z]2\d)|([A-Z]2\d2)|([A-Z]\d[A-Z])|([A-Z]2\d[A-Z])|(GIR))$

当然您可能希望同时支持大写和小写字符,如果是这种情况,只需将所有出现的[A-Z] 更改为[A-Za-z]GIR 更改为[gG][iI][rR]

请记住,这将仅验证邮政编码的格式,而不验证邮政编码是否存在,为此,您可以从 geonames.org 下载信息并将其解析到数据库中以供日后检查.

【讨论】:

以上是关于模式匹配部分英国邮政编码的主要内容,如果未能解决你的问题,请参考以下文章

带有空格的英国邮政编码的Java正则表达式[重复]

正则表达式匹配英国邮政编码的前半部分

通过匹配邮政编码字符串查找最接近其他英国邮政编码的英国邮政编码

正则表达式匹配英国邮政编码

我怎样才能模式匹配 ID 只确保变量编号匹配而不必硬编码所有的可能性?

正则表达式考点