4

我有一个验证英国邮政编码的 javascript 正则表达式。它工作得很好,但它没有考虑到有些人在中间写有空格而其他人没有。我尝试添加此内容,但无法解决:S UK 邮政编码主要是 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

有任何想法吗?

编辑

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

4

5 回答 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
于 2012-06-18T11:51:59.897 回答
6

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

var postalCode = '…';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`
于 2012-06-18T11:56:08.383 回答
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)。

坦率地说,我会在基本检查后停止打扰。如果值得根据更完整的规范进行验证,那么可能值得检查邮政编码区域是否存在,如果这值得,您不妨连接到从邮政编码中提取地址的真实服务。这些服务会很高兴地通知您邮政编码不存在,这是一种比您想要编写的更强大和可维护的检查。

[编辑:当然还有维基百科上的另一个规范]

于 2012-06-18T12:31:52.360 回答
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

于 2013-06-04T09:42:02.863 回答
1

我不知道英国邮政编码是怎么做的,从你的描述我也没有理解。顺便说一句,您可以\s{0,1}在需要说“这里我们可以有一个空间”的地方添加。它的意思是“0 或 1 个空格”。

于 2012-06-18T11:45:49.793 回答