Regex Croatian OIB (personal identification number)
The OIB has 11 digits: 10 random digits carrying no personal information, and an 11th check digit computed per ISO 7064 modulo 11,10 (DG TAXUD specification). The format carries no date or structure, so a regex can only validate length and characters. The key is expressed in code: x = 10, then for each digit d, y = (d + x) % 10 (0 becomes 10) and x = 2y % 11; the key is 11 − x, brought to 0 if 10. The real attempts I read are all short: two anchor, one is an unanchored detector, and one requires the 'HR' prefix of the VAT form, which rejects a bare OIB.
/^\d{11}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (hr-HR) — ancrée et équivalente au motif recommandé ; ne contrôle pas la clé (« 94577403195 » passe) | ^\d{11}$ | 22 / 22 | safe |
| django-localflavor (HROIBField) — ancrée et équivalente ; la clé est vérifiée dans le code Python, pas dans la regex | ^\d{11}$ | 22 / 22 | safe |
| piigex (détecteur hr_oib) — lookarounds seulement : « OIB 94577403194 » et « x-94577403194 » passent | (?<!\d)\d{11}(?!\d) | 17 / 22 | safe |
| Relativity aiR (Croatia VAT ID) — exige le préfixe « HR » de la forme TVA : un OIB seul (« 94577403194 ») est rejeté ; seule la forme avec préfixe passe | \bHR\d{11}\b | 10 / 22 | safe |
Implementation
const re = new RegExp("^\\d{11}$", "");
re.test(input);Limits
- Valide seulement la FORME : 11 chiffres. La clé ISO 7064 modulo 11,10 n'est pas vérifiée : « 94577403195 » passe. Utilisez le contrôle de code décrit dans l'introduction.
- Le préfixe « HR » de l'OIB utilisé comme numéro de TVA (« HR94577403194 ») est rejeté : retirez-le avant de valider.
- Le format ne contient aucune structure interne vérifiable par regex ; ce motif ne distingue donc un OIB que d'une chaîne de longueur ou de caractères différents. Aucune vérification d'attribution ; n'utilisez en test que des numéros d'exemple ou synthétiques.