Rexact
Cheatsheet

Regex adresse IPv4 en notation CIDR

L'auteur de la question de référence sur Stack Overflow a un bug qu'il constate lui-même : sa regex, censée valider un préfixe CIDR, accepte aussi « 192.168.0.0/aaaa » — parce que le groupe optionnel n'est jamais suivi d'une ancre de fin de chaîne. Une réponse à 17 votes corrige l'ancrage, mais reste volontairement limitée aux préfixes /16 et /24 (la demande initiale) ; un commentaire propose une extension à /16-/32, mais oublie la moitié inférieure de la plage (/0 à /15). Aucune des tentatives ne vérifie que chaque octet reste sous 256. Voici un motif qui couvre tout /0-/32 avec des octets réellement bornés, comparé à ces 3 tentatives réelles.

/^(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}(?:/(?:3[0-2]|[12]?[0-9]))?$/
passe 20/20 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}(?:/(?:3[0-2]|[12]?[0-9]))?$", "");
re.test(input);

Limites

  • Valide seulement la forme : n'indique pas si l'adresse et le préfixe forment un bloc réseau correctement aligné (ex. « 192.168.0.5/24 » est syntaxiquement accepté même si .5 n'est pas une adresse réseau ronde pour ce préfixe).
  • N'accepte que la notation avec préfixe numérique (« /24 ») : le masque de sous-réseau à l'ancienne écriture décimale pointée (« 255.255.255.0 ») suit une syntaxe entièrement différente, non couverte ici.
  • Ne distingue pas les adresses réservées (privées RFC 1918, loopback, multicast) : la forme seule ne dit rien sur la routabilité ou l'usage réel de l'adresse.
  • Ne couvre pas IPv6 ni sa propre notation CIDR (« /64 », préfixes jusqu'à 128) : un motif séparé est nécessaire pour ce protocole.

Pages liées