Regex adresse IPv4
Beaucoup de regex IPv4 trouvées en ligne se contentent de compter les chiffres (1 à 3 par octet) sans jamais vérifier qu'un octet reste sous 256. Voici un motif qui vérifie réellement chaque octet, comparé aux versions les plus copiées.
/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — tentative initiale de l'auteur de la question (bug démontré au grep) | ^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(?:\.|$)){4}$ | 17 / 22 | sûr |
| Stack Overflow — variante golfée de la même réponse (41 car., lookahead, moins lisible) | ^(((?!25?[6-9])[12]\d|[1-9])?\d\.?\b){4}$ | 22 / 22 | sûr |
| Stack Overflow — « sans valider 0-255, juste 1 à 3 chiffres » (bobble bubble, assumé par l'auteur) | ^(?:\b\.?\d{1,3}){4}$ | 17 / 22 | sûr |
Implémentation
const re = new RegExp("^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$", "");
re.test(input);Limites
- Valide seulement la forme : n'indique pas si l'adresse est routable, privée (RFC 1918) ou réellement attribuée.
- N'accepte pas la notation CIDR (ex. « 192.168.1.0/24 ») : un motif séparé est nécessaire pour valider un préfixe réseau.
- N'accepte pas les formes historiques abrégées (« 127.1 » pour 127.0.0.1, ou un entier décimal unique comme « 2130706433 ») que certains outils systèmes tolèrent encore par héritage.
- Ne couvre pas IPv6 ni les adresses IPv4-mapped IPv6 (ex. « ::ffff:192.168.1.1 »).