JavaScript 英国邮编正则表达式

4
我有一个验证英国邮编的javascript正则表达式。它工作得很好,但没有考虑到有些人在中间加上空格,有些人则没有。我尝试过添加这个功能,但是无法解决 :S 英国邮编主要由2个字母和1或2个数字组成,可以加上可选的空格,然后再加上1个数字和2个字母。
以下是我的正则表达式,用于验证没有空格的邮编:
[A-PR-UWYZa-pr-uwyz0-9][A-HK-Ya-hk-y0-9][AEHMNPRTVXYaehmnprtvxy0-9]?[ABEHMNPRVWXYabehmnprvwxy0-9]?{1,2}[0-9][ABD-HJLN-UW-Zabd-hjln-uw-z]{2}|(GIRgir){3} 0(Aa){2})$/g

有什么想法吗?

编辑

我更改了正则表达式,因为我意识到一个组缺少小写字符。


1
@jsalonen,这并不是“恶意输入”,当然需要进行服务器端的检查!但您还想在客户端向用户展示:“哦,对不起先生,我认为您犯了一个错误,您想纠正吗?” - Adi
1
如果您正在服务器端检查邮政编码,您可以在客户端检查中重用该代码:1)将数据发送到服务器进行验证,2)如果验证失败(在服务器端),则返回具有特定错误消息的表单。通过这种方式,您就不需要维护两个单独的邮政编码检查代码! - jsalonen
4
/i 使你的正则表达式不区分大小写: [A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?{1,2}[0-9][ABD-HJLN-UW-Z]{2}|(GIR){3} 0A{2})$/gi - Stefan
1
BFPO邮编的格式非常不同。 - symcbean
2
可以通过将其转换为大写并在传递给正则表达式之前删除任何空格来作弊。 - msanders
显示剩余10条评论
5个回答

6

2个字母后跟1或2位数字,可选空格和1位数字,最后是2个字母。

示例:

/^[a-z]{2}\d{1,2}\s*\d[a-z]{2}$/i

使用 http://www.myregextester.com/ 进行解释。
  ^                        the beginning of the string
----------------------------------------------------------------------
  [a-z]{2}                 any character of: 'a' to 'z' (2 times)
----------------------------------------------------------------------
  \d{1,2}                  digits (0-9) (between 1 and 2 times
                           (matching the most amount possible))
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \d                       digits (0-9)
----------------------------------------------------------------------
  [a-z]{2}                 any character of: 'a' to 'z' (2 times)
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

@ThisGuyHasTwoThumbs 不需要使用 {1},也不需要在使用 /i 时包含两种情况,即:/^[a-z]{1,2}\d{1,2}\s*\d[a-z]{2}$/i\d{1,2} 也可以写成 \d\d? - Qtax

6

另一种解决方案是从字符串中删除所有空格,然后将其通过您已经拥有的正则表达式运行:

var postalCode = '…';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`

3
根据我找到的存档页面,规范如下:
Pattern    w/o space   RLE                General
AN NAA     ANNAA       A1 N2 A2         | A{1,2} N{2,3} A2
ANN NAA    ANNNAA      A1 N3 A2         |
AAN NAA    AANNAA      A2 N2 A2         |
AANN NAA   AANNNAA     A2 N3 A2         |

ANA NAA    ANANAA      A1 N1 A1 N1 A2   | A{1,2} N1 A1 N1 A2  
AANA NAA   AANANAA     A2 N1 A1 N1 A2   |

GIR 0AA    We are British and for every rule there must be an 
           equal and opposite exception.

也许在页面验证中这太麻烦了,不值得费心。请记住,如果有任何更改,您将不得不维护它。考虑进行最小检查,例如 ^[A-Z].+[0-9].+[A-Z]$ 。不要成为“英雄”,复制粘贴代码。
如果您真的想根据该规范进行验证,则一般规则(去除空格后)如下:
^([A-Z]{1,2})([0-9]{2,3})([A-Z]{2})$/i
^([A-Z]{1,2})([0-9])([A-Z])([0-9])([A-Z]{2})$/i
^GIR0AA$/i

正如@Stefan所指出的:/i表示不区分大小写。
完成后,您可以匹配组(因此是大括号),并检查字母是否与文档中的受限范围相匹配。此时,您甚至可以维护允许的邮政编码区域的一个或两个字母代码列表。
将Incode(空格前的块)与Outcode(空格后的块)分开的一般规则似乎是Outcode从最后一个数字开始(即使对于GIR也是如此)。
老实说,我会在基本检查之后停止烦恼。如果值得根据更完整的规范进行验证,那么检查邮政编码区域是否存在就很有价值,如果这很值得,那么您可能会连接到从邮政编码中提取地址的真实服务。这些服务将乐意告诉您邮政编码不存在,这比您想要编写的更健壮和可维护的检查更好。
[编辑:当然还有另一个规范在维基百科上]

2
我们发现大多数正则表达式并不能完全覆盖英国邮编。我们发现需要包括以下选项:
- A1 1AA - A1A 1AA - AA11 1AA
基于此,我建议使用以下正则表达式:
/^([A-Z][A-Z0-9]?[A-Z0-9]?[A-Z0-9]? {1,2}[0-9][A-Z0-9]{2})$/;
邮编 GIR0AA 曾经属于 Girobank,但已不再支持,参见: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

这是一个很好的答案。但为什么不将其缩短为:/^([A-Z][A-Z0-9]{0,3}\s?[0-9][A-Z0-9]{2})$/i - glboothby
这不允许使用伦敦市或威斯敏斯特市的邮政编码(EC1A,WC2A等)。 - Martin Greenaway

1

我不知道英国的邮政编码是如何制定的,也无法从您的描述中理解。顺便说一下,在需要说明“这里可以有一个空格”的地方,您可以添加\s{0,1}。它表示“0或1个空格”。


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