IPv4 шаблоны
IPv4 — стандартный 32-битный адрес, записывается как 4 числа от 0 до 255 через точки: 192.168.1.1. Ограничен ~4.3 млрд адресов, поэтому в 2024 году постепенно вытесняется IPv6 (более триллиона уникальных адресов).
Шаблон 1 — простой (95% случаев)
^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$4 числа из 1-3 цифр через точку. Принимает: 192.168.1.1, 8.8.8.8, 0.0.0.0. ПРОБЛЕМА: принимает 999.999.999.999 (числа до 999 — невалидно для IP). Для базовой валидации хватает + дополнительная проверка через split + parseInt.
Шаблон 2 — строгий (валидация октетов 0-255)
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$Каждый октет в диапазоне 0-255: 25[0-5] (250-255), 2[0-4]\\d (200-249), [01]?\\d\\d? (0-199). Принимает 192.168.1.1, 255.255.255.255, 0.0.0.0. Не принимает 256.1.1.1.
Шаблон 3 — извлечение из текста (логи)
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\bИспользуется с \\b (word boundary) для извлечения IP из лог-строк. Работает с строками вида: 192.168.1.1 - - [01/May/2024:14:30:00] "GET /".
Шаблон 4 — IP с портом
^(\d{1,3}\.){3}\d{1,3}:(\d{1,5})$Принимает: 192.168.1.1:8080, 127.0.0.1:3000. Полезно для парсинга строк подключения. Порт 1-65535 (полная валидация требует более сложного regex).
IPv4 addresses consist of four octets, each represented as a decimal number between 0 and 255, separated by periods. The total address space contains 2^32 = 4,294,967,296 unique addresses, including reserved ranges for special purposes.— RFC 791 — Internet Protocol, IETF
IPv6 шаблоны
IPv6 — 128-битный адрес, 8 групп по 4 hex-цифры через двоеточие: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. Сжимается через :: (последовательные нули): 2001:db8::1.
Полная форма (без сжатия)
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$Принимает: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. Не принимает сжатые формы.
Простой regex (с сжатием через ::)
^(([0-9a-fA-F]{1,4}:){1,7}|:)(:?[0-9a-fA-F]{1,4}|:)$Покрывает большинство случаев: 2001:db8::1, ::1, fe80::1, 2001:db8:85a3::8a2e:370:7334. Не идеален (некоторые edge-cases пропускает), но для 95% задач хватает.
Полный regex (RFC-compliant, ~200 символов)
Полный валидатор IPv6 — 200+ символов regex. Лучше использовать готовые библиотеки: net.ParseIP в Go, ipaddress в Python, net в Node.js. Они обрабатывают все edge-cases правильно.
Частные сети (RFC 1918)
Адреса для внутренних сетей, не маршрутизируются в интернете:
Regex для определения частной сети
^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|127\.|169\.254\.)
Принимает: 10.0.0.1, 192.168.1.1, 127.0.0.1, 172.16.0.1. Полезно для исключения private IPs из аналитики, allowlist в админке.
Практические сценарии
Извлечение IP из Nginx логов
# Самые частые IP за день
grep "$(date +%d/%b/%Y)" access.log \
| awk '{print $1}' \
| sort | uniq -c | sort -rn | head -10
# Только non-private IP (внешний трафик)
grep -Eo "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log \
| grep -v "^10\.\|^192\.168\.\|^127\." \
| sort -uJavaScript — валидация IP
function isValidIPv4(ip) {
const parts = ip.split('.');
if (parts.length !== 4) return false;
return parts.every(p => {
const num = parseInt(p, 10);
return !isNaN(num) && num >= 0 && num <= 255 && p === num.toString();
});
}
function isPrivateIP(ip) {
if (!isValidIPv4(ip)) return false;
const parts = ip.split('.').map(Number);
return (
parts[0] === 10 ||
(parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) ||
(parts[0] === 192 && parts[1] === 168) ||
parts[0] === 127 ||
(parts[0] === 169 && parts[1] === 254)
);
}Python — для логов
import re
import ipaddress
# Извлечь все IP из текста
def extract_ips(text):
pattern = r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
candidates = re.findall(pattern, text)
valid = []
for ip in candidates:
try:
ipaddress.IPv4Address(ip)
valid.append(ip)
except ValueError:
pass
return valid
# Проверка на private
def is_private(ip):
return ipaddress.IPv4Address(ip).is_private- RFC 791 — Internet Protocol. IETF. datatracker.ietf.org/doc/html/rfc791. 1981.
- RFC 1918 — Address Allocation for Private Internets. IETF. datatracker.ietf.org/doc/html/rfc1918. 1996.
- RFC 4291 — IPv6 Addressing Architecture. IETF. datatracker.ietf.org/doc/html/rfc4291. 2006.
