RegEx for matching UK Postcodes

前端 未结 30 2299
广开言路
广开言路 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 01:55

    Here's a regex based on the format specified in the documents which are linked to marcj's answer:

    /^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/
    

    The only difference between that and the specs is that the last 2 characters cannot be in [CIKMOV] according to the specs.

    Edit: Here's another version which does test for the trailing character limitations.

    /^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/
    
    0 讨论(0)
  • 2020-11-22 01:55

    here's how we have been dealing with the UK postcode issue:

    ^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$
    

    Explanation:

    • expect 1 or 2 a-z chars, upper or lower fine
    • expect 1 or 2 numbers
    • expect 0 or 1 a-z char, upper or lower fine
    • optional space allowed
    • expect 1 number
    • expect 2 a-z, upper or lower fine

    This gets most formats, we then use the db to validate whether the postcode is actually real, this data is driven by openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

    hope this helps

    0 讨论(0)
  • 2020-11-22 01:55

    This one allows empty spaces and tabs from both sides in case you don't want to fail validation and then trim it sever side.

    ^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$)
    
    0 讨论(0)
  • 2020-11-22 01:57

    An old post but still pretty high in google results so thought I'd update. This Oct 14 doc defines the UK postcode regular expression as:

    ^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
    

    from:

    https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

    The document also explains the logic behind it. However, it has an error (bolded) and also allows lower case, which although legal is not usual, so amended version:

    ^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$
    

    This works with new London postcodes (e.g. W1D 5LH) that previous versions did not.

    0 讨论(0)
  • 2020-11-22 01:57

    Some of the regexs above are a little restrictive. Note the genuine postcode: "W1K 7AA" would fail given the rule "Position 3 - AEHMNPRTVXY only used" above as "K" would be disallowed.

    the regex:

    ^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$
    

    Seems a little more accurate, see the Wikipedia article entitled 'Postcodes in the United Kingdom'.

    Note that this regex requires uppercase only characters.

    The bigger question is whether you are restricting user input to allow only postcodes that actually exist or whether you are simply trying to stop users entering complete rubbish into the form fields. Correctly matching every possible postcode, and future proofing it, is a harder puzzle, and probably not worth it unless you are HMRC.

    0 讨论(0)
  • 2020-11-22 01:59
    ^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$
    

    Regular expression to match valid UK postcodes. In the UK postal system not all letters are used in all positions (the same with vehicle registration plates) and there are various rules to govern this. This regex takes into account those rules. Details of the rules: First half of postcode Valid formats [A-Z][A-Z][0-9][A-Z] [A-Z][A-Z][0-9][0-9] [A-Z][0-9][0-9] [A-Z][A-Z][0-9] [A-Z][A-Z][A-Z] [A-Z][0-9][A-Z] [A-Z][0-9] Exceptions Position - First. Contraint - QVX not used Position - Second. Contraint - IJZ not used except in GIR 0AA Position - Third. Constraint - AEHMNPRTVXY only used Position - Forth. Contraint - ABEHMNPRVWXY Second half of postcode Valid formats [0-9][A-Z][A-Z] Exceptions Position - Second and Third. Contraint - CIKMOV not used

    http://regexlib.com/REDetails.aspx?regexp_id=260

    0 讨论(0)
提交回复
热议问题