我有一个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
有什么想法吗?
修改
我改变了正则表达式,因为我意识到一个组缺少小写字符。
答案 0 :(得分: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
答案 1 :(得分:6)
另一种解决方案是从字符串中删除所有空格,然后通过您已有的正则表达式运行它:
var postalCode = '…';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`
答案 2 :(得分:3)
根据an archived page I found,规范是:
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)。
坦率地说,在基本检查后我会停止打扰。如果值得对更完整的规范进行验证,则可能值得检查邮政编码区域是否存在,如果值得,您也可以连接到从邮政编码中提取地址的真实服务。这些服务很高兴地通知您,邮政编码不存在,这是一种比您想写的更强大和可维护的检查。[编辑:当然还有另一个规范on Wikipedia]
答案 3 :(得分:2)
我们发现大多数正则表达式并未完全涵盖英国邮政编码。我们发现它需要涵盖以下选项:
基于此,我建议:
/^([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
答案 4 :(得分:1)
我不知道英国邮政编码是如何完成的,我从你的描述中不了解它。顺便说一下,您可以在{“1}}添加”需要说“我们可以有空间”。它的意思是“0或1个空格”。