Regex shipping container number (ISO 6346)
A container number isn't just "4 letters + 7 digits": the 4th letter must be U (freight), J (detachable equipment) or Z (trailer/chassis) - never anything else. An older version of the npm library validator.js only accepted U, wrongly rejecting J and Z containers that are perfectly valid under the standard. The current version fixes that, but introduces a subtler bug: due to | operator precedence, the end anchor only applies to one branch of the alternation, letting stray text slip in after an otherwise correct number. Here's a pattern covering all three categories without that trap, compared against both validator.js versions and a third attempt.
/^[A-Z]{3}[UJZ][0-9]{7}$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[A-Z]{3}[UJZ][0-9]{7}$", "");
re.test(input);Limits
- 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.