Validation for Irish Eircode
Updated this answer avoiding char B
. You can try this:
/^[AC-Y]{1}[0-9]{1}[0-9W]{1}[ \-]?[0-9AC-Y]{4}$/
Description:
^ assert position at start of the string
[AC-Y]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
[0-9]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
[0-9W]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
W the literal character W (case sensitive)
[ \-]? match a single character present in the list below
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
the literal character
\- matches the character - literally
[0-9AC-Y]{4} match a single character present in the list below
Quantifier: {4} Exactly 4 times
0-9 a single character in the range between 0 and 9
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
$ assert position at end of the string
Starting from hywak answer and following the other comments suggestions, this is my php regex:
/^([AC-FHKNPRTV-Y]\d{2}|D6W)\s[0-9AC-FHKNPRTV-Y]{4}$/
I added ^ and $ to define the starting and ending of the string. Added \s to consider the space and accept the format XXX XXXX.
Reference regarding format letter/numbers and letters to avoid: https://en.wikipedia.org/wiki/List_of_postal_codes
Regex tester
Here the explanation of the last codes that do pass the test:
- D14 N2Fz -> Last letter lowercase
- a65 f4e2 -> All charcters are lowercase
- D6W FNTO -> Letter O is not allowed
Since @Manwal's answer doesn't exactly do what it should, here is my attempt at shortening the regex for OP:
(?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$
Updated version supporting the A65 B2CD postcodes - (?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$
This is basically what your Regex is, with a few changes:
- Removed commas. You do not need commas to list items inside
[]
brackets. - Added ranges where possible and where it would save some space (
C-F
,V-Y
). Elsewhere it's not beneficial to add ranges, as it won't make regex shorter. - You do not need to escape a space. " " in regex is literal.
- You also do not need to escape the dash if it's the last character in character class (square brackets)
- The first part of the regex is now in a non-capturing group to allow ORing it with the only possible letter for 3rd position, the "D6W" case.
It is also possible to deal with D6W
exclusively with lookbehind, but this is more of an art than regex.
See Regex Demo: here
You can also invert the character class to not include given characters, and while it doesn't make the regex shorter, it's also worth noting. However, you need to make sure that other characters (like dots, commas) are not included too. I do it by adding the \W
token.
You can try it here
According to Product guide chapter 1.5.4 allowed signs are:
-----------------------------------------------------------------------
| Component | Position | Allowed characters |
-----------------------------------------------------------------------
| Routing Keys | 1 | A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y |
-----------------------------------------------------------------------
| Routing Keys | 2 | 0-9 |
-----------------------------------------------------------------------
| Routing Keys | 3 | 0-9 with the exception of W for D6W |
-----------------------------------------------------------------------
| Unique Identifier | 4 | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y |
-----------------------------------------------------------------------
| Unique Identifier | 5 | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y |
-----------------------------------------------------------------------
| Unique Identifier | 6 | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y |
-----------------------------------------------------------------------
| Unique Identifier | 7 | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y |
-----------------------------------------------------------------------
Every routing key must contain letter and two digits except ONE specific situation which is D6W
code.
So codes begening with A5W
, C6W
, V0W
are invalid.
According to chapter 1.5.1 Recommendations for Storage and Presentation
- An Eircode should always be stored as a single string of seven upper case characters in IT systems, i.e. A65F4E2.
- An Eircode should always be presented in upper case as two parts separated by a space, on stationary, mail items, computer forms, etc. i.e. A65 F4E2 and never A65F4E2.
Codes stored in database shouldn't be separated with space
or dash
, should be separated but only by space
and only for displaying.
Assuming, correct regex should looks like:
/([AC-FHKNPRTV-Y]\d{2}|D6W)[0-9AC-FHKNPRTV-Y]{4}/
Regex online tester
Ericode guide