Regex de Endereço IPv4
O padrão acima corresponde corretamente apenas a endereços IPv4 válidos. Das strings de teste, corresponde a 192.168.1.1, 10.0.0.255, 172.16.0.1, 255.255.255.0, 8.8.8.8, 0.0.0.0 e 127.0.0.1. Rejeita 999.999.999.999, 256.1.1.1 e 1.2.3 (apenas tres octetos).
Detalhamento do Padrão
Cada octeto usa uma alternancia de tres vias para aplicar a faixa de 0 a 255:
| Ramo de alternancia | Faixa coberta | Exemplos de correspondencia |
|---|---|---|
25[0-5] | 250 a 255 | 250, 255 |
2[0-4]\d | 200 a 249 | 200, 214, 249 |
[01]?\d\d? | 0 a 199 | 0, 99, 192 |
A alternancia e envolvida em um grupo não capturador (?:...) e repetida tres vezes com \. entre elas usando {3}, então o octeto final repete a mêsma alternancia. Limites de palavra \b em ambas as extremidades evitam que o padrão corresponda a um endereço IP que aparece como substring de algo maior.
Por que o Padrão Ingênuo Falha
\d+\.\d+\.\d+\.\d+ é a primeira coisa que a maioria tenta. Falha em duas direções:
Corresponde a strings que não são endereços IP válidos. 999.999.999.999 corresponde porque \d+ não impoe limite ao valor numerico.
Pode produzir falsos positivos dentro de strings mais longas. Sem limites de palavra, o padrão corresponde a fragmentos parciais em strings de versão, timêstamps e números decimais.
O padrão correto baseado em alternancia lida com ambos os problemas.
Notação CIDR
Para também corresponder a blocos CIDR como 192.168.1.0/24, adicione (\/([0-9]|[1-2]\d|3[0-2]))? ao final do padrão base (antes do \b final). Issó torna o comprimento do prefixo opcional e válida que ele esta entre 0 e 32.
Padrão IPv6
Um padrão para a notação completa padrão de 8 grupos:
([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}
Issó corresponde a 2001:0db8:85a3:0000:0000:8a2e:0370:7334 mas não lida com compressão ::, que é a forma abreviada que omite grupos consecutivos de zeros. Por exemplo, ::1 (loopback) e 2001:db8::1 são ambos endereços IPv6 válidos que este padrão não captura.
Uma abordagem prática para logs: use o padrão liberal ([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4} para extrair candidatos, depois valide cada candidato com uma função de biblioteca.
Detecção de Faixas Privadas
As tres faixas IPv4 privadas definidas pelo RFC 1918:
| Faixa | CIDR | Prefixo regex |
|---|---|---|
| Classe A privada | 10.0.0.0/8 | ^10\. |
| Classe B privada | 172.16.0.0/12 | `^172.(1[6-9] |
| Classe C privada | 192.168.0.0/16 | ^192\.168\. |
A faixa Classe B (172.16 a 172.31) exige a alternancia para o segundo octeto porque não e possıvel expressar “16 a 31” com uma classe de caracteres simples. Faixas especiais adicionais a considerar: loopback (127.0.0.0/8), link-local (169.254.0.0/16) e documentação (192.0.2.0/24).
Quando Pular o Regex
Para válidar um único endereço IP enviado por um usuario, use uma função embutida da linguagem:
# Python
import ipaddress
try:
ipaddress.ip_address("192.168.1.1")
# válido
except ValueError:
# inválido
// Node.js
const net = require('net');
net.isIPv4('192.168.1.1'); // true
net.isIPv4('999.1.1.1'); // false
Essas funções lidam com casos extremos que o regex ignora, incluindo zeros a esquerda (alguns analisadores interpretam 010 como octal 8) e endereços IPv6 mapeados por IPv4. O regex continua sendo a ferramenta certa para extrair endereços IP de arquivos de log, logs de acessó ou qualquer texto de formato livre onde você precise encontrar todas as ocorrencias em uma string maior.
Para gerar ou verificar hashes de endereços IP em contextos de seguranca, o Gerador de Hash no DevBento lida com algoritmos comuns sem sair do navegador.