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

Posted

技术标签:

【中文标题】英国邮政编码正则表达式验证【英文标题】:UK postcode regex validation 【发布时间】:2015-08-07 10:30:48 【问题描述】:

我正在寻找一个有效的英国邮政编码正则表达式模式,但似乎它们中的任何一个都可以作为传统或正常的正则表达式。

我使用此工具测试所有模式:https://regex101.com/

我在本文档中找到的正则表达式 https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf 不起作用。

我在这个 wiki 页面https://en.wikipedia.org/wiki/Talk:Postcodes_in_the_United_Kingdom 中尝试了所有正则表达式,但没有。

我做错了吗?

我正在编写一个 Angular 指令。

var regex = ????;

// add a parser that will process each time the value is 
// parsed into the model when the user updates it.
ngModel.$parsers.unshift(function(value) 
    // test and set the validity after update.
    var valid = regex.test(value);
    console.log(valid);
    ngModel.$setValidity('ukPostcode', valid);

    // if it's valid, return the value to the model, 
    // otherwise return undefined.
    return valid ? value : undefined;
);

谢谢。

【问题讨论】:

它们在哪些方面不起作用?不匹配有效的邮政编码?让无效的通过?两个都?还有什么? 以下邮政编码的验证失败:rg224ph、rg141de。我住在那里,所以它们是 100% 有效的邮政编码。 尽管您声明:“我使用此工具测试所有模式:regex101.com”[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)$ 无法在那里编译:regex101.com/r/dM9eC1/1 试试^(?:[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)$。确实,您的正则表达式中有 2 个问题:组设置不正确,因为前导 ( 不存在,1,2 限制量词设置在 ? 之后,这是不允许的。其实我不明白你想用(GIRgir)3 0(Aa)2匹配什么:它匹配GIRgirGIRgirGIRgir 0AaAa 任何这个正则表达式都是我写的,这就是为什么我说明了我从哪里得到它们的 URL。所以官方的正则表达式是错误的!!! 【参考方案1】:

当您的正则表达式被更正时,它匹配两者:

rg224ph rg141de

你的正则表达式当前有two errors:

[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)
                                                                                                 ^ 1,2 Preceding token is not quantifiable

[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)
                                                                                                                                                                ^ ) Unbalanced parenthesis

我想你想要的正则表达式是:

([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)

哪个matches both inputs。

【讨论】:

是的,我也猜到了,但没有任何反馈。你确定GIRgirGIRgirGIRgir 0AaAa是OP需要匹配的吗? @stribizhev 我同意这很奇怪。我怀疑预期的选项是:[GIRgir]3 0[Aa]2

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

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

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

正则表达式匹配英国邮政编码的前半部分

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

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

用于识别英国邮政编码的 R 正则表达式