Rexact
Cheatsheet

Regex identifiant MMSI

Un MMSI n'est pas juste « 9 chiffres » : sa structure change selon le type de station — un navire commence directement par son indicatif de pays (MID, 201-775), une station côtière par deux zéros, un aéronef de recherche et sauvetage par « 111 ». La bibliothèque JS mmsi.js se contente de vérifier la longueur, tandis que la norme ouverte Signal K (utilisée en électronique de plaisance) ne couvre que le format « navire » et rejette à tort toutes les autres catégories pourtant légitimes. Voici un motif qui couvre les six structures normalisées, comparé à ces trois tentatives.

/^(?:(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{6}|0(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{5}|00(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{4}|111(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{3}|8(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{5}|9[89](?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\d{4})$/
passe 22/22 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
mikeu/mmsi.js (bibliothèque JS de parsing MMSI) — ne vérifie que le nombre de chiffres, accepte n'importe quel MID hors de la plage 201-775^[0-9]{9}$18 / 22sûr
Signal K specification (norme ouverte d'électronique marine) — ne couvre que le format « navire », rejette à tort les stations côtières, aéronefs SAR et autres catégories légitimes^[2-7][0-9]{8}$17 / 22sûr
regex101.com (auteur Shay Nissel, se réclamant conforme à la doc USCG) — répète 5 fois le même sous-motif de plage MID et code en dur les préfixes DOM français comme alternatives littérales^((((2(0[1-9]|[1-9][0-9]))|([3-6][0-9]{2})|(7([0-6][0-9]|7[0-5])))[0-9]{6})|((0|8)((2(0[1-9]|[1-9][0-9]))|([3-6][0-9]{2})|(7([0-6][0-9]|7[0-5])))[0-9]{5})|((00|99|98)((2(0[1-9]|[1-9][0-9]))|([3-6][0-9]{2})|(7([0-6][0-9]|7[0-5])))[0-9]{4})|(111((2(0[1-9]|[1-9][0-9]))|([3-6][0-9]{2})|(7([0-6][0-9]|7[0-5])))[0-9]{3})|((970|972|974)[0-9]{6}))$21 / 22sûr

Implémentation

const re = new RegExp("^(?:(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{6}|0(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{5}|00(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{4}|111(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{3}|8(?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{5}|9[89](?:2(?:0[1-9]|[1-9][0-9])|[3-6][0-9]{2}|7(?:[0-6][0-9]|7[0-5]))\\d{4})$", "");
re.test(input);

Limites

  • Valide seulement la STRUCTURE (préfixe par catégorie + plage de MID 201-775) : ne consulte aucun registre d'attribution réel — un MMSI syntaxiquement valide selon ce motif peut n'avoir jamais été attribué à un navire ou une station existants.
  • Ne couvre pas les séries spéciales non liées à un pays : les identifiants d'appareils de recherche et sauvetage (SART, préfixe 970), de dispositifs homme à la mer (MOB, préfixe 972) et de balises EPIRB-AIS (préfixe 974) suivent une structure différente, hors périmètre de ce motif.
  • N'impose pas les contraintes fines documentées sur certains chiffres de remplissage (ex. le 7ᵉ chiffre d'un aéronef SAR distingue voilure fixe et hélicoptère) : ce motif valide la structure générale, pas chaque chiffre à signification propre.
  • Exige une chaîne de 9 chiffres consécutifs sans séparateur : les espaces parfois utilisés à l'affichage doivent être retirés avant validation.