★ India · regex
Regex for Indian Vehicle Number
Standard plates are a state or UT code, a 1–2 digit RTO number (Delhi adds a category letter, as in DL 3C), up to three series letters and four digits. Bharat-series plates are the registration year, BH, four digits and one or two letters.
- Runs in your browser
- No signup
Try the indian vehicle number pattern
Read it in plain English (best-effort)
- ^start of a line
- (?:start a group (not captured)
- (?:start a group (not captured)
- ANthe text 'AN'
- |or
- APthe text 'AP'
- |or
- ARthe text 'AR'
- |or
- ASthe text 'AS'
- |or
- BRthe text 'BR'
- |or
- CGthe text 'CG'
- |or
- CHthe text 'CH'
- |or
- DDthe text 'DD'
- |or
- DLthe text 'DL'
- |or
- DNthe text 'DN'
- |or
- GAthe text 'GA'
- |or
- GJthe text 'GJ'
- |or
- HPthe text 'HP'
- |or
- HRthe text 'HR'
- |or
- JHthe text 'JH'
- |or
- JKthe text 'JK'
- |or
- KAthe text 'KA'
- |or
- KLthe text 'KL'
- |or
- LAthe text 'LA'
- |or
- LDthe text 'LD'
- |or
- MHthe text 'MH'
- |or
- MLthe text 'ML'
- |or
- MNthe text 'MN'
- |or
- MPthe text 'MP'
- |or
- MZthe text 'MZ'
- |or
- NLthe text 'NL'
- |or
- ODthe text 'OD'
- |or
- ORthe text 'OR'
- |or
- PBthe text 'PB'
- +49 more
One sample per line works well with the m flag on anchored patterns.
The pattern, piece by piece
/^(?:(?:AN|AP|AR|AS|BR|CG|CH|DD|DL|DN|GA|GJ|HP|HR|JH|JK|KA|KL|LA|LD|MH|ML|MN|MP|MZ|NL|OD|OR|PB|PY|RJ|SK|TN|TR|TS|UK|UP|WB)[ -]?[0-9]{1,2}[A-Z]?[ -]?[A-Z]{0,3}[ -]?[0-9]{4}|[0-9]{2}[ -]?BH[ -]?[0-9]{4}[ -]?[A-Z]{1,2})$/| Part | What it does |
|---|---|
(?:AN|AP|…|WB) | a valid state or union territory code |
[0-9]{1,2}[A-Z]? | RTO number, with an optional category letter (Delhi) |
[A-Z]{0,3} | series letters |
[0-9]{4} | the four-digit number |
|[0-9]{2}[ -]?BH[ -]?[0-9]{4}[ -]?[A-Z]{1,2} | or a Bharat-series plate: year, BH, number, letters |
What it accepts and rejects
Every sample below is checked automatically in JavaScript and Python. The tester above is preloaded with all of them, one per line.
| Should match | |
|---|---|
MH12AB1234 | ✓ |
MH 12 AB 1234 | ✓ |
DL 3C AB 1234 | ✓ |
KA-01-MJ-2023 | ✓ |
TN 09 BX 0001 | ✓ |
22 BH 1234 AA | ✓ |
| Should not match | |
|---|---|
XX 12 AB 1234 | ✗ |
MH 123 AB 1234 | ✗ |
MH 12 ABCD 1234 | ✗ |
MH12AB123 | ✗ |
22 BH 123 AA | ✗ |
mh12ab1234 | ✗ |
Copy it into your code
RE2-safeNo lookarounds or backreferences, so the same pattern works in Go's RE2 engine and in Rust's regex crate.
const indianVehicleNumberRe = /^(?:(?:AN|AP|AR|AS|BR|CG|CH|DD|DL|DN|GA|GJ|HP|HR|JH|JK|KA|KL|LA|LD|MH|ML|MN|MP|MZ|NL|OD|OR|PB|PY|RJ|SK|TN|TR|TS|UK|UP|WB)[ -]?[0-9]{1,2}[A-Z]?[ -]?[A-Z]{0,3}[ -]?[0-9]{4}|[0-9]{2}[ -]?BH[ -]?[0-9]{4}[ -]?[A-Z]{1,2})$/;
export function isValidIndianVehicleNumber(value) {
return indianVehicleNumberRe.test(value.trim());
}When not to use regex for this
To check a registration is real and fetch vehicle details, use the government's VAHAN/Parivahan services. Uppercase and strip separators before storing.
Questions engineers actually ask
What is a BH (Bharat) series number?
Why is the list of state codes hard-coded?
What is catastrophic backtracking?
Sources
Formats were checked on 8 November 2026. Rules change; the official issuer wins if it disagrees.
More india patterns
- Indian Mobile Number10-digit Indian mobiles starting 6–9, with optional +91, 91 or 0.^(?:\+91[ -]?|91[ -]?|0)?[6-9]\d{4}[ -]?\d{5}$
- Indian PIN CodeSix-digit PIN codes not starting with 0, optionally written as 3 + 3.^[1-9][0-9]{2} ?[0-9]{3}$
- PAN Card Number10-character PAN: 5 letters, 4 digits, 1 letter, with a valid holder-type letter.^[A-Z]{3}[ABCFGHJLPT][A-Z][0-9]{4}[A-Z]$
- GSTIN15-character GST number: state code, PAN, entity number, Z, check character.^(?:0[1-9]|[12][0-9]|3[0-8]|97)[A-Z]{3}[ABCFGHJLPT][A-Z][0-9]{4}[A-Z][1-9A-Z]Z[0-9A-Z]$
- Aadhaar Number Format12 digits not starting with 0 or 1, in 4-4-4 groups. Format only.^[2-9][0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}$
- IFSC Code11 characters: 4-letter bank code, a zero, 6-character branch code.^[A-Z]{4}0[A-Z0-9]{6}$
- UPI ID (VPA)username@handle virtual payment addresses like name@okaxis.^[a-zA-Z0-9][a-zA-Z0-9._-]{1,255}@[a-zA-Z][a-zA-Z0-9]{1,63}$
Or browse the full regex library.
More from the workbench
Fine print
Tools: on the house.
Engineer: by the hour.
The regex was free. Code that doesn't need one is the upgrade: typed schemas, validated once at the edge, trusted everywhere after.
I'm Himanshu, an AI and full-stack engineer. I build MVPs, AI agents and the growth plumbing around them for early-stage startups.
