Regex numéro VIN (identification véhicule)
L'auteur de la question de référence sur Stack Overflow avait un bug très concret : sa regex rejetait deux vrais VIN parce qu'elle exigeait que les 6 derniers caractères soient uniquement des chiffres. La réponse la plus votée l'explique noir sur blanc : sur le VIN « 1ftfw1et4bfc45903 », les 6 derniers caractères sont « bfc45903 »… qui contiennent des lettres. Une autre réponse, très permissive (juste 17 caractères sans lettres I/O/Q), est qualifiée par une réponse concurrente de filet « bien trop large ». Une troisième utilise une syntaxe de sous-motif récursif PCRE qui ne compile tout simplement pas en JavaScript. Voici un motif qui respecte la vraie structure (clé de contrôle en position 9, chiffre ou X), comparé à ces 3 tentatives réelles.
/^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{8}$/iComparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — regex de l'auteur de la question, exige que les 6 derniers caractères soient uniquement des chiffres (bug démontré et expliqué dans la réponse la plus votée) | ^[A-HJ-NPR-Za-hj-npr-z\d]{8}[\dX][A-HJ-NPR-Za-hj-npr-z\d]{2}\d{6}$ | 16 / 20 | sûr |
| Stack Overflow — réponse à 11 votes, aucune structure interne (qualifiée de « filet bien trop large » par une réponse concurrente sur le même fil) | ^[A-HJ-NPR-Z0-9]{17}$ | 19 / 20 | sûr |
| Stack Overflow — réponse utilisant la syntaxe de sous-motif récursif PCRE « (?1) », ne compile pas en JavaScript | ^(?:([A-HJ-NPR-Z]){3}|\d{3})(?1){2}\d{2}(?:(?1)|\d)(?:\d|X)(?:(?1)+\d+|\d+(?1)+)\d{6}$ | ne compile pas | — |
Implémentation
const re = new RegExp("^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{8}$", "i");
re.test(input);Limites
- Scope limité aux VIN nord-américains (NHTSA/SAE J853, en vigueur depuis 1981) : les VIN européens et de nombreux autres pays suivent uniquement la norme ISO 3779 de base, sans clé de contrôle à la position 9 — un vrai VIN européen valide peut donc être rejeté à tort par ce motif (signalé en commentaire sur le fil source).
- Ne vérifie pas la clé de contrôle elle-même (calcul pondéré modulo 11 défini par la NHTSA) : seule sa position et son alphabet (chiffre ou X) sont vérifiés, pas sa valeur réelle par rapport aux 16 autres caractères.
- Ne couvre pas les véhicules d'avant 1981, dont le VIN pouvait compter de 11 à 17 caractères sans structure standardisée.
- Une chaîne de 17 caractères syntaxiquement valide selon ce motif n'est pas nécessairement un VIN réellement attribué à un véhicule existant : la forme ne garantit ni l'existence ni la cohérence du code constructeur (WMI) avec le reste du numéro.