Regex IPv4 address
Many IPv4 regexes found online just count digits (1 to 3 per octet) without ever checking that an octet stays under 256. Here's a pattern that actually checks each octet, compared against the most copied versions.
/^(?:(?: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])$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| Stack Overflow — « sans valider 0-255, juste 1 à 3 chiffres » (bobble bubble, assumé par l'auteur) | ^(?:\b\.?\d{1,3}){4}$ | 17 / 22 | safe |
Implementation
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);Limits
- 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 »).