# UK Postcode Regexes
# Progression from loose to strict.
# One regex per line; blank lines separate groups
# Lines starting # are comments.

# Anything non-empty
^.+$

# Anything right length, non-empty
^.{6,9}$

# Right character set (uppercase letters, digits, space)
^[A-Z0-9 ]{6,9}$

# Right character set and broad structure
^[A-Z0-9]{2,4} [0-9][A-Z]{2}$

# Right structure, quite detailed, but always allows subdistrict
^([A-Z]{1,2}[0-9]{1,2}[A-Z]?|GIR|NPT) [0-9][A-Z]{2}$

# Restrict letters letters to those actually used anywhere
^([A-PR-UWYZ][A-HK-Y]?[0-9]{1,2}[A-HJKMNPR-VWXY]?|GIR|NPT) [0-9][ABD-HJLNP-VW-Z]{2}$

# All valid postal area codes listed explicitly (CHECK — ~124 areas)
^((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|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|GU|GY|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)[0-9]{1,2}[A-HJKMNPR-VWXY]?|GIR|NPT) [0-9][ABD-HJLNP-VW-Z]{2}$

# Government transfer spec (uppercase only, pipe restored, handles NPT via optional digit)
^(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})$

# Full Royal Mail spec as a single combined regex
# (factors out the shared inward code; outward part covers all four structural types)
^(([A-PR-UWYZ][0-9][0-9A-HJKPSTUW]?|[A-PR-UWYZ][A-HK-Y][0-9][0-9ABEHMNPRVWXY]?|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]) [0-9][ABD-HJLNP-VW-Z]{2}|GIR 0AA)$


# London areas (with optional subdistrict) and non-London areas (without),
# plus GIR, all sharing the inward code. GIR slightly over-accepts.
^((EC|WC|NW|SE|SW|E|N|W)[0-9]{1,2}[A-Z]?|(AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|EH|EN|EX|FK|FY|G|GL|GU|GY|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|NE|NG|NN|NP|NR|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|WA|WD|WF|WN|WR|WS|WV|YO|ZE)[0-9]{1,2}|GIR|NPT) [0-9][ABD-HJLNP-VW-Z]{2}$

# As above but GIR handled explicitly, removing the over-acceptance.
^(((EC|WC|NW|SE|SW|E|N|W)[0-9]{1,2}[A-Z]?|(AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|EH|EN|EX|FK|FY|G|GL|GU|GY|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|NE|NG|NN|NP|NR|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|WA|WD|WF|WN|WR|WS|WV|YO|ZE)[0-9]{1,2}|NPT) [0-9][ABD-HJLNP-VW-Z]{2}|GIR 0AA)$
