6

可能重复:
英国邮政编码正则表达式(综合)

我有以下代码用于验证 javascript 中的邮政编码:

function valid_postcode(postcode) {
    postcode = postcode.replace(/\s/g, "");
    var regex = /[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}/i;
    return regex.test(postcode);
}

测试:

CF47 0HW - Passes - Correct
CF47 OHW - Passes - Incorrect

我已经进行了大量研究,但似乎无法为这个常见的验证要求找到最终的正则表达式。有人可以指出我正确的方向吗?

4

3 回答 3

8

通过添加 ^ 和 $ 使您的正则表达式更严格。这应该有效:

function valid_postcode(postcode) {
    postcode = postcode.replace(/\s/g, "");
    var regex = /^[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}$/i;
    return regex.test(postcode);
}
于 2012-12-20T10:02:50.907 回答
8

您需要一个“明确的正则表达式”——考虑到英国邮政编码的所有排列,因此它需要“不必要地大”。这是我过去用过的一个

"(GIR 0AA)|((([ABCDEFGHIJKLMNOPRSTUWYZ][0-9][0-9]?)|(([ABCDEFGHIJKLMNOPRSTUWYZ][ABCDEFGHKLMNOPQRSTUVWXY][0-9][0-9]?)|(([ABCDEFGHIJKLMNOPRSTUWYZ][0-9][ABCDEFGHJKSTUW])|([ABCDEFGHIJKLMNOPRSTUWYZ][ABCDEFGHKLMNOPQRSTUVWXY][0-9][ABEHMNPRVWXY])))) [0-9][ABDEFGHJLNPQRSTUWXYZ]{2})"

请注意,例如,我从不只使用 AZ,因为在每个部分中总是排除某些字母。

于 2012-12-20T10:38:26.830 回答
1

问题是函数的第一行。通过修剪目标字符串中的空格,您允许误报。

CF47OHW 将匹配 [AZ]{1,2}[0-9]{1,2} ?[0-9][AZ]{2}

CF matches [A-Z]
4 matches [0-9]{1,2}
(blank) matches \s?
7 matches [0-9]
OH matches [A-Z]{2}
W gets discarded

因此,正如 Paulgrav 所说,添加开始和结束字符(^ 和 $)将解决它。

此时,您还可以删除 \s? 从你的正则表达式的中间位。

然而!尽管该错误已得到修复,但您的正则表达式仍然无法按您希望的方式工作。您应该在此站点UK Postcode Regex (Comprehensive)上查看以下相当好的答案

于 2012-12-20T10:30:31.093 回答