正则表达式匹配英国邮政编码

Posted

技术标签:

【中文标题】正则表达式匹配英国邮政编码【英文标题】:Regex match UK postcode 【发布时间】:2013-07-23 15:40:23 【问题描述】:

我需要测试一个字符串并确保它是有效的英国邮政编码。

我的代码目前是这样工作的:

var re = /GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2))|BFPO[ ]?\d1,4/;
console.log(re.test('WD4 9PL'));

返回 true

但是,如果我在 PL 之后添加额外的文本,它也会返回 true

var re = /GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2))|BFPO[ ]?\d1,4/;
console.log(re.test('WD4 9PL TEST'));

第二个应该返回false,如何实现?

【问题讨论】:

你从哪里得到这些值? 【参考方案1】:

将您的正则表达式包装在 ^$ 中以确保匹配完整的字符串:

var re = /^(GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2))|BFPO[ ]?\d1,4)$/;
console.log(re.test('WD4 9PL'));

^ 匹配行首

$ 匹配行尾

注意,我也把它包裹在()

/^abc|def$/ 将匹配 abc........def

/^(abc|def)$/ 将仅匹配 abcdef

例子:

> /abc/.test("abcd")
true
> /^abc$/.test("abcd")
false
> /^abc$/.test("abc")
true

【讨论】:

如果你测试 re.test('WD4 9PL TESt'),这仍然返回 true。 刚刚做了:re.test('WD4 9PL TESt') -> false 如果您感到困惑,^ 表示“字符串必须在此处开始匹配”,$ 表示“字符串必须 在这里结束比赛”。 /[0-9]+/ 将匹配 somewhere 中具有数字的任何字符串,而 /^[0-9]+/ 匹配具有任意数量 (1+) 的字符串 starting数字。 感谢 Mishik,刚刚注意到您的编辑添加了括号,现在返回 false。

以上是关于正则表达式匹配英国邮政编码的主要内容,如果未能解决你的问题,请参考以下文章

带有空格的英国邮政编码的Java正则表达式[重复]

英国邮政编码正则表达式验证

使用正则表达式验证英国邮政编码

C# - 英国邮政编码正则表达式没有按预期工作?

英国邮政编码的正则表达式

带空格的英国邮政编码正则表达式