ИНСТР-REGEX-IPIPv4 / IPv6Логи · Парсинг · Валидацияревизия 2026-05-07

Regex для IP адреса

Готовые regex для IPv4, IPv6, частных сетей. Извлечение IP из логов, валидация, парсинг.

⏱ работает в браузере · без регистрации
Инструмент · ИНСТР-REGEX-IP|real-time
calcal.ru / ip-adres-regex-ipv4-ipv6
Загрузка...
4
Шаблонов IPv4
3
Формата IPv6
RFC 1918
Частные сети
0
Запросов к серверу

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)

Адреса для внутренних сетей, не маршрутизируются в интернете:

ДиапазонCIDRПрименение
10.0.0.0 - 10.255.255.25510.0.0.0/8Корпоративные сети
172.16.0.0 - 172.31.255.255172.16.0.0/12Docker по умолчанию
192.168.0.0 - 192.168.255.255192.168.0.0/16Домашние роутеры
127.0.0.0 - 127.255.255.255127.0.0.0/8Loopback (localhost)
169.254.0.0 - 169.254.255.255169.254.0.0/16APIPA / link-local
100.64.0.0 - 100.127.255.255100.64.0.0/10CGNAT (моб. операторы)

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 -u

JavaScript — валидация 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
ИСТОЧНИКИ
  1. RFC 791 — Internet Protocol. IETF. datatracker.ietf.org/doc/html/rfc791. 1981.
  2. RFC 1918 — Address Allocation for Private Internets. IETF. datatracker.ietf.org/doc/html/rfc1918. 1996.
  3. RFC 4291 — IPv6 Addressing Architecture. IETF. datatracker.ietf.org/doc/html/rfc4291. 2006.
ЧАСТЫЕ ВОПРОСЫ

Часто задаваемые вопросы

<code>^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$</code> — простой, но принимает 999.999.999.999. Строгий: <code>^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$</code> — каждый октет 0-255. Для большинства случаев простого хватает + проверка через split + parseInt в коде.
IPv6 имеет несколько форматов. Полный (8 групп): 2001:0db8:85a3:0000:0000:8a2e:0370:7334. Сжатый (с ::): 2001:db8::1. Mixed (с IPv4): ::ffff:192.168.1.1. Полный regex покрывает все варианты — около 200 символов. Простой: <code>^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$</code> — не идеален, но 95% случаев. Лучше использовать ipaddress библиотеку (Python) или net.ParseIP (Go).
Адреса для внутренних сетей (RFC 1918): 10.0.0.0/8 (10.x.x.x), 172.16.0.0/12 (172.16-31.x.x), 192.168.0.0/16 (192.168.x.x). Не маршрутизируются в интернете. Также: 127.0.0.0/8 (loopback / localhost). 169.254.0.0/16 (APIPA / link-local). 100.64.0.0/10 (CGNAT — операторские сети). Для определения «внутренний или внешний» — проверьте по этим диапазонам.
Используйте \b (word boundary) для извлечения: <code>\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b</code>. В bash: <code>grep -Eo "...regex..." access.log | sort -u</code>. В Python: <code>re.findall(r"\b...\b", log)</code>. Для Apache/Nginx логов: первое поле — обычно IP клиента, проще <code>awk '{print $1}'</code>.
Не используйте просто req.connection.remoteAddress — это IP прокси (Nginx, Cloudflare). Правильно: проверить headers X-Forwarded-For (от Cloudflare), X-Real-IP (от Nginx). Express: <code>req.headers["x-forwarded-for"]?.split(",")[0] || req.connection.remoteAddress</code>. PHP: <code>$_SERVER["HTTP_X_FORWARDED_FOR"]</code> или <code>$_SERVER["REMOTE_ADDR"]</code>. ВАЖНО: эти headers можно подделать, проверяйте только если перед сервером есть доверенный прокси.
Да. Россия имеет ~5% IPv6 traffic в 2024 (Google IPv6 Statistics). США — 50%. Индия — 80%. Если ваш сайт работает только с IPv4, мобильные пользователи (которые часто на IPv6 от оператора) могут получать ошибки. Проверьте на ipv6-test.com. Большинство хостингов (DigitalOcean, AWS, Yandex Cloud) поддерживают IPv6 из коробки. nginx настройка: <code>listen [::]:443 ssl;</code>.
CIDR (Classless Inter-Domain Routing) — нотация для IP-диапазонов. Например, 192.168.0.0/24 = 192.168.0.0 - 192.168.0.255 (256 адресов). Число после слеша — количество битов в network части. /24 = первые 24 бита фиксированы, последние 8 бит варьируются. /16 = 65 536 адресов. /32 = один адрес. Для блокировки/разрешения диапазонов в файрволе используется CIDR.
Используйте базы MaxMind GeoLite2 (бесплатная) или GeoIP2 (платная). Локально — устанавливаете базу 80MB, lookup занимает микросекунды. API: ipapi.co, ip-api.com (бесплатно с лимитами). Для собственного сервиса: лучше локальная база — нет latency, нет rate limits. Точность: страна — 99%, город — 70-80%, точные координаты — нет.
Лиана Арифметова
АВТОРverifiedред. calcal.ru

Лиана Арифметова

Создатель и главный редактор

Миссия: демократизировать сложные расчёты. Превратить страх перед числами в ясность и контроль. Девиз: «Любая повторяющаяся задача заслуживает своего калькулятора».

Mathematical Engineering · МФТИ · редактирует каталог с 2012 года

Был ли этот калькулятор полезен?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Инструмент справочный — не заменяет эксперта

Только для информационных целей. Все расчёты, результаты и данные, предоставляемые инструментом, носят исключительно ознакомительный и справочный характер. Они не являются профессиональной консультацией — медицинской, юридической, финансовой, инженерной или иной.

Точность результатов. Калькулятор основан на общепринятых формулах и методиках, однако фактические результаты могут отличаться в зависимости от индивидуальных условий, исходных данных и применяемых стандартов. Мы не гарантируем полноту, точность или актуальность приведённых расчётов.

Профессиональные решения — медицинские, финансовые, инженерные — должны приниматься только после консультации с квалифицированным специалистом. Не используйте автоматический расчёт как единственное основание для важных решений.

Ограничение ответственности. Авторы и разработчики сервиса не несут ответственности за прямой или косвенный ущерб, возникший из-за использования данных расчётов. Пользователь принимает на себя всю ответственность за интерпретацию результатов.