Regex numéro de conteneur maritime (ISO 6346)
Un numéro de conteneur, ce n'est pas juste « 4 lettres + 7 chiffres » : la 4e lettre doit être U (fret), J (équipement détachable) ou Z (remorque/châssis) — jamais autre chose. Une ancienne version de la bibliothèque npm validator.js n'acceptait que U, rejetant à tort les conteneurs J et Z pourtant valides selon la norme. La version actuelle corrige ça, mais introduit un bug plus subtil : à cause de la précédence de l'opérateur « | », l'ancre de fin ne porte que sur une des deux branches de l'alternative, laissant passer du texte parasite après un numéro par ailleurs correct. Voici un motif qui couvre les trois catégories sans ce piège, comparé à ces deux versions de validator.js et une troisième tentative.
/^[A-Z]{3}[UJZ][0-9]{7}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Ancienne version de validator.js (PR historique, bibliothèque npm très populaire) — n'accepte que la catégorie U, rejette à tort les conteneurs J et Z pourtant valides | ^[A-Z]{3}U[0-9]{7}$ | 18 / 20 | sûr |
| Version actuelle de validator.js — bug de précédence de l'opérateur |, l'ancre de fin ne porte que sur la branche J/Z, du texte parasite peut suivre un numéro de catégorie U par ailleurs correct | ^[A-Z]{3}(U[0-9]{7})|([J,Z][0-9]{6,7})$ | 18 / 20 | sûr |
| Container-validator-JS (GitHub) — valide la forme mais n'exécute aucun calcul de chiffre de contrôle dans la regex elle-même, un numéro à la clé fausse passe | ^([A-Z]{3})(U|J|Z)(\d{6})(\d)$ | 20 / 20 | sûr |
Implémentation
const re = new RegExp("^[A-Z]{3}[UJZ][0-9]{7}$", "");
re.test(input);Limites
- Valide seulement la FORME (4 lettres, catégorie U/J/Z, 7 chiffres) : ne calcule pas le chiffre de contrôle (conversion lettre→chiffre puis somme pondérée modulo 11) — un numéro syntaxiquement valide selon ce motif peut avoir une clé fausse et ne correspondre à aucun conteneur réellement enregistré (voir CSQU3054384 dans les exemples, structure correcte mais clé fausse).
- Ne consulte pas le registre officiel BIC (bic-code.org) : seule une recherche dans ce registre confirme qu'un préfixe de 3 lettres est réellement attribué à un propriétaire de conteneurs.
- N'accepte que les majuscules, conformément à la présentation officielle : un numéro de conteneur physiquement peint en minuscules ou mélangé doit être normalisé avant validation.
- Ne différencie pas les trois catégories dans son résultat (fret, équipement détachable, remorque/châssis) : ce motif confirme seulement que la 4e lettre appartient à l'une des trois, sans indiquer laquelle.