1

I know this seems like a duplicate but I have tried all other solutions posted here, here, here, here and here.

I am looking for a regex which can validate just the pattern (with space) of the first part or full UK postcode. I don't want to check for the authenticity of a postcode.

So far I have came up with this

((([A-Za-z]?[A-Za-z])[1-9]?([0-9]|[A-Za-z]))|(([A-Za-z]?[A-Za-z])[1-9]?([0-9]|[A-Za-z])\s[1-9][A-Za-z][A-Za-z]))$

This seems to work fine for all the patterns. But this also validates the reverse postcode (LastPart FirstPart) eg. (6FW OX28)

I am looking for following pattern (copied from this question)

1 Letter  1 Number
1 Letter  2 Numbers
2 Letters 1 Number
2 Letters 1 Number  1 Letter
2 Letters 2 Numbers
1 Letter  1 Number  (Space) 1 Number 2 Letters
1 Letter  2 Numbers (Space) 1 Number 2 Letters
2 Letters 1 Number  (Space) 1 Number 2 Letters
2 Letters 1 Number  1 Letter (Space) 1 Number 2 Letters
2 Letters 2 Numbers (Space) 1 Number 2 Letters
Community
  • 1
  • 1
SkoolCodeian
  • 127
  • 1
  • 14
  • Without any examples (valid and invalid), it is difficult to help. However, perhaps, you just miss the `^` anchor at the beginning of the pattern? – Wiktor Stribiżew Dec 15 '15 at 09:45

2 Answers2

1

This looks sufficient (updated per comment):

^([A-Z]\d{1,2}|[A-Z]{2}\d(\d|[A-Z]?))( \d[A-Z]{2})?$

see test

It includes a long explanation, I'll give a short version

Basically there are 2 parts, the code can be either only first part, or first then second.

First part is ([A-Z]\d{1,2}|[A-Z]{2}\d(\d|[A-Z])?)
Meaning:
[A-Z]\d{1,2} - a letter and 1-2 digits
| - OR
[A-Z]{2}\d - two letters, a digit, then
(\d|[A-Z])? - either a digit, a letter, or nothing (by using ? to make it optional).

The second part is static - [space][digit][two letters] which is ( \d[A-Z]{2}) it's made optional by using the ? symbol.

JNF
  • 3,696
  • 3
  • 31
  • 64
  • You forgot about `2 Letters 1 Number 1 Letter (Space) 1 Number 2 Letters` and validate two invalid types of `1 Letter 1 Number 1 Letter` and `1 Letter 2 Numbers 1 Letter` ;). – shA.t Dec 15 '15 at 11:00
  • @shA.t, thanks, revised. I had the pattern you said was missing, but you were right about validating wrong ones – JNF Dec 15 '15 at 12:10
  • How can you make it so it doesn't care whether characters are upper or lowercase? – a7dc Aug 04 '20 at 18:14
  • 1
    @A7DC every place that has `A-Z`, add `a-z`, like `[A-Za-z]` – JNF Sep 03 '20 at 05:50
1

The best that I can suggest is this:

/^[a-z](\d\d?|[a-z]\d[a-z\d]?|[a-z]?\d?\d \d[a-z]{2}|[a-z]\d [a-z] \d[a-z]{2})$/i

[Regex Demo]

shA.t
  • 16,580
  • 5
  • 54
  • 111