RegEx for matching UK Postcodes

前端 未结 30 2514
广开言路
广开言路 2020-11-22 01:38

I\'m after a regex that will validate a full complex UK postcode only within an input string. All of the uncommon postcode forms must be covered as well as the usual. For in

30条回答
  •  自闭症患者
    2020-11-22 02:04

    I needed a version that would work in SAS with the PRXMATCH and related functions, so I came up with this:

    ^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$
    

    Test cases and notes:

    /* 
    Notes
    The letters QVX are not used in the 1st position.
    The letters IJZ are not used in the second position.
    The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
    The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
    The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
    */
    
    /*
        Bits and pieces
        1st position (any):         [A-PR-UWYZ]         
        2nd position (if letter):   [A-HK-Y]
        3rd position (A1A format):  [A-HJKPSTUW]
        4th position (AA1A format): [ABEHMNPRV-Y]
        Last 2 positions:           [ABD-HJLNP-UW-Z]    
    */
    
    
    data example;
    infile cards truncover;
    input valid 1. postcode &$10. Notes &$100.;
    flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
    cards;
    1  EC1A 1BB  Special case 1
    1  W1A 0AX   Special case 2
    1  M1 1AE    Standard format
    1  B33 8TH   Standard format
    1  CR2 6XH   Standard format
    1  DN55 1PT  Standard format
    0  QN55 1PT  Bad letter in 1st position
    0  DI55 1PT  Bad letter in 2nd position
    0  W1Z 0AX   Bad letter in 3rd position
    0  EC1Z 1BB  Bad letter in 4th position
    0  DN55 1CT  Bad letter in 2nd group
    0  A11A 1AA  Invalid digits in 1st group
    0  AA11A 1AA  1st group too long
    0  AA11 1AAA  2nd group too long
    0  AA11 1AAA  2nd group too long
    0  AAA 1AA   No digit in 1st group
    0  AA 1AA    No digit in 1st group
    0  A 1AA     No digit in 1st group
    0  1A 1AA    Missing letter in 1st group
    0  1 1AA     Missing letter in 1st group
    0  11 1AA    Missing letter in 1st group
    0  AA1 1A    Missing letter in 2nd group
    0  AA1 1     Missing letter in 2nd group
    ;
    run;
    

提交回复
热议问题