Rexact
Cheatsheet

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}$/i
passe 20/20 cas

Comparatif des patterns existants

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.