Javascript英国邮政编码验证

6
我有以下JavaScript代码用于验证邮政编码:

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

我需要在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

我已经做了大量的研究,但似乎找不到这个常见验证要求的明确正则表达式。请问有人可以指导我吗?


我使用了这个测试工具:http://www.regular-expressions.info/javascriptexample.html,你提供的例子按预期工作。第一个通过了,第二个没有。 - jnovacho
@willemD'haeseleer 我已经放弃了那个脚本,因为我认为它太大了,没有必要。 - dai.hop
@jnovacho 我在Safari 6中得到了"无匹配项"的结果,这两个示例都是如此。 - dai.hop
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);
}

6
这不允许使用大量的伦敦邮政编码,例如Downing Street的编码是SW1A 2AA,白金汉宫的编码是SW1A 1AA。请改用以下代码:const regex = /^[A-Z]{1,2}[0-9]{1,2}[A-Z]{0,1} ?[0-9][A-Z]{2}$/i; - colincclark

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})"

注意我从未只使用A-Z,因为在每个部分中总会排除某些字母。

这是正确的,但也有一些重复。这已经在以下问题中得到回答:https://dev59.com/THVC5IYBdhLWcg3w2lCI - Mark Withers
事实上,在阅读您的问题中提到的链接之前,我已经发布了我的答案。因此,建议将该问题视为重复。 - duncan

1
问题出在您函数的第一行。通过从目标字符串中去除空格,您会导致误报。
CF47OHW将匹配[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{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)


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