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

239
我需要一个正则表达式来验证一个包含在输入字符串中的完整的英国邮编,包括所有不常见的邮编形式和通常的形式。例如:

匹配

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

不匹配

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H
如何解决这个问题?

2
@axrwkr,那看起来并不有帮助。 - Kieran Benton
8
英国邮编验证 - JavaScript 和 PHP 我无法使用接受的答案匹配有效的邮政编码,但我找到了这个,它可以匹配有效的邮政编码。对于客户端验证,JavaScript 版本可以直接使用;对于服务器端验证,将 JavaScript 重写为 C# 相对容易。它甚至重新格式化邮政编码以添加空格,因此如果你输入邮政编码 W1A1AA,它不仅会验证它,还会将其重新格式化为 W1A 1AA。它甚至处理了各种不寻常的来自英国领土的邮政编码。 - user2985029
2
提供的链接无法处理“AA1A 1AA”格式。参考:http://www.dhl.com.tw/content/dam/downloads/tw/express/forms/postcode_formats.pdf - Anthony Scaife
2
如果您只想验证邮政编码,我们提供一个免费(需要注册)的验证REST API端点 - http://developers.alliescomputing.com/postcoder-web-api/address-lookup/validate-postcode - Stephen Keable
1
好问题。我认为在您需要匹配的罕见示例列表中,包括曼彻斯特市中心邮政编码,例如“M1 3HZ”,是值得的。许多人不知道字母和数字组合的规则。 - Martin Joiner
1
这里的许多答案都基于英国政府提供的一个错误的正则表达式。有关这些问题的详细信息,请参阅我的答案 - ctwheels
33个回答

-1
今天我完成了对英国邮政编码的正则表达式验证,据我所知,它适用于所有英国邮政编码,并且无论您是否在其中加入空格,都可以正常工作。
^((([a-zA-Z][0-9])|([a-zA-Z][0-9]{2})|([a-zA-Z]{2}[0-9])|([a-zA-Z]{2}[0-9]{2})|([A-Za-z][0-9][a-zA-Z])|([a-zA-Z]{2}[0-9][a-zA-Z]))(\s*[0-9][a-zA-Z]{2})$)

如果有任何格式没有涵盖,请告诉我


1
@Mecanik... 如果你要批评,那就必须详细说明你的问题。这将使每个人都能从你的反馈中学习。 - Monty

-1
我从一个XML文档中偷来了这个,看起来它覆盖了所有情况而不需要硬编码GIRO:
%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(Ruby语法,忽略大小写)

-1

我需要一个能够在SAS中使用PRXMATCH和相关函数的版本,所以我想出了这个:

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

测试用例和注释:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接