【问题标题】:Javascript UK postcode regexJavascript 英国邮政编码正则表达式
【发布时间】:2012-06-18 11:25:13
【问题描述】:

我有一个验证英国邮政编码的 javascript 正则表达式。它工作得很好,但它没有考虑到有些人在中间写空格而其他人没有。我尝试添加此内容,但无法解决:S UK 邮政编码主要是 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

有什么想法吗?

编辑

当我意识到一组缺少小写字符时,我更改了正则表达式。

【问题讨论】:

  • @jsalonen,这不是“恶意输入”,当然服务器端检查是必须的!但是您还想向您的用户展示客户端大小的“哦,对不起,先生,我认为您在此处犯了一个错误,您想纠正它吗”
  • 如果您在服务器端检查邮政编码,您可以在客户端检查中重复使用该代码:1) 将数据发送到服务器进行验证,2) 如果验证失败(在服务器端)返回到带有特定错误消息的表单。通过这种方式,您不需要维护两个单独的邮政编码检查代码!
  • @PhilFaceplantYoung /i 使您的正则表达式不区分大小写:[A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?{1,2}[0-9][ABD-HJLN-UW-Z]{2}|(GIR){3} 0A{2})$/gi
  • BFPO 邮政编码的格式非常不同
  • 总是可以作弊并将其转换为大写并删除任何空格,然后再将其传递给正则表达式。

标签: javascript regex postal-code


【解决方案1】:

另一种解决方案是从字符串中删除所有空格,然后通过您已有的正则表达式运行它:

var postalCode = '…';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • @ThisGuyHasTwoThumbs 不需要使用{1},如果使用/i,也不需要包括这两种情况,即:/^[a-z]{1,2}\d{1,2}\s*\d[a-z]{2}$/i。 \d{1,2}也可以写成\d\d?。
    【解决方案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.
    

    也许这在页面验证中太麻烦了。请记住,如果发生变化,您将不得不维护它。考虑像@​​987654324@ 这样的最小检查。不要成为“英雄”并编写代码样板。

    如果您真的想根据该规范对其进行验证,一般规则(去除空格后)是:

    ^([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]

    【讨论】:

      【解决方案4】:

      我们发现大多数正则表达式并未完全涵盖英国邮政编码。我们发现它需要涵盖以下选项:

      • A1 1AA
      • A1A 1AA
      • AA11 1AA

      基于此,我建议:

      /^([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

      【讨论】:

      • 这是一个很好的答案。但为什么不将其缩短为:/^([A-Z][A-Z0-9]{0,3}\s?[0-9][A-Z0-9]{2})$/i
      • 这不允许使用伦敦市或威斯敏斯特市的邮政编码(EC1A、WC2A 等)。
      【解决方案5】:

      我不知道英国邮政编码是怎么做的,从你的描述我也没有看懂。顺便说一句,您可以在需要说“这里我们可以有一个空间”的地方添加\s{0,1}。它的意思是“0 或 1 个空格”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多