Regular Expression to validate Sri Lankan National Identity Card numbers
I crafted a Regular Expression for Sri Lankan phone numbers before, and here is one to validate Sri Lankan National Identify Card numbers.
Regular Expression
PCRE
Legacy 9-digit numbers
^(?:19|20)?\d{2}(?:[0-35-8]\d\d(?<!(?:000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)))\d{4}(?i:v|x)$
JS flavor
^(?:19|20)?\d{2}(?:[0-35-8]\d\d(?<!(?:000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)))\d{4}(?:[vVxX])$
Explanation
[NIC numbers](https://en.wikipedia.org/wiki/National_identity_card_(Sri_Lanka)
- 9 digits followed by an English character
- 11 digits followed by an English character
The linked Wikipedia articles explains the parsing approach.
The above regex:
- Validates both new and old NIC number formats
- Correctly validates birth year to be in current or the last century
- Validates the possible number range for both male and female numbers (do not blame me for binary genders)
- Validates the last English letter, where it must be one of
v
orx
that indicates the NIC holder is allowed to vote or not, respectively.