Skip to content

Instantly share code, notes, and snippets.

Last active August 1, 2023 16:00
  • Star 18 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
An example of using a simplified UK postcode regex in Javascript
var tweet = "Currently chilling out at W1B 2EL, then on to WC2E 8HA or maybe even L1 8JF! :-)";
// Here's a simple regex that tries to recognise postcode-like strings.
// See
// for the rules on how UK postcodes are formatted.
var postcode_regex = /[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}/g;
var postcodes = tweet.match(postcode_regex);
Copy link

NB: this is a simplified regular expression that just looks for the basic letter/number patterns that are legal in UK postcodes. It won't validate the pattern as a legitimate UK postcode. (e.g. it will match Q1 1QQ, despite the fact that Q is never used as the first letter in a UK postcode.)

For a more comprehensive regular expression, see this Stack Overflow post.

Copy link

CR0 1DE doesn't seem to match.. this is however a real postcode.

Copy link

The reason why 'CR0 1DE' doesn't work is because the 'i' needs to be added to the end of the regular expression in order to make it case insensitive - for example:

var postcode_regex = /[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}/gi;

Hope this helps.

Copy link

foxx commented Oct 14, 2014

Seems to match all the correct patterns, thanks!

  A9 9AA
 A9A 9AA
 A99 9AA
 AA9 9AA
AA99 9AA

Copy link

it doesnt cover this ones

Copy link


Copy link

indirap commented Dec 18, 2017

Copy link

MarkBird commented Feb 8, 2018

I'd advise anyone arriving here from search engines to avoid the regex in the above comment (it's perhaps typical that the UK government would be using a badly formed regex) because it doesn't match a lot of valid postcodes (e.g. W1T 1PG), and it's inconsistent in that it matches some postcodes with a space and some without. The one posted by lucasjahn seems to work fine though.

Copy link

BWLR commented Aug 20, 2019

Thanks for the heads up @MarkBird
Just arrived here in the future from a search engine.

Copy link

Likewise, thanks @MarkBird!

Copy link

Degats commented Apr 21, 2022

As someone else arriving in the future from a search engine, I was curious why the UK Gov's validation didn't work as mentioned by @MarkBird.

Turns out that the regex itself appears to be correct - just not when you copy-paste it. The error is because one of the important '-' characters gets stripped out when you copy it, as it thinks that it's to break a word across a newline.

I'm not sure what the comment about spaces means; looking at the regex, it requires exactly one space (0x20) character, so is perhaps a little pedantic for some uses. It successfuly finds all the example postcodes in @diegoarcega's test (except WC2A, which is not a complete postcode on its own, but is a prefix/district. Full WC2A 0XX postcodes are matched)

This is the probably correct (but pedantic) regex from the UK Gov document linked by @indirap, to save anyone else from the copypaste issue:

^([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-9][A-Za-z]{2})$

Edit: tested and working against the ONS list of ~2.6million real postcodes (all have spaces)

Copy link

Thanks for the helpful post!

My use case needed it to also work with 0 or 1 spaces {0,1}, so here is my slightly modded version for anyone's convenience, including future me!

^([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})$

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment