регулярное выражение javascript для проверки IP-адресов - PullRequest
36 голосов
/ 16 декабря 2010

У меня есть несколько IP-адресов, таких как:

  1. 115.42.150.37
  2. 115.42.150.38
  3. 115.42.150.50

Какой тип регулярного выражения мне следует написать, если я хочу найти все 3 IP-адреса? Например, если я сделаю 115.42.150.* (я смогу найти все 3 IP-адреса)

Что я могу сделать сейчас, это что-то вроде: /[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}/, но, похоже, это не работает хорошо.

Спасибо.

Ответы [ 19 ]

87 голосов
/ 12 декабря 2014

Может быть поздно, но кто-то может попробовать:

Пример VALID IP-адреса

115.42.150.37
192.168.0.1
110.234.52.124

Пример INVALID IP-адреса

210.110 – must have 4 octets
255 – must have 4 octets
y.y.y.y – only digits are allowed
255.0.0.y – only digits are allowed
666.10.10.20 – octet number must be between [0-255]
4444.11.11.11 – octet number must be between [0-255]
33.3333.33.3 – octet number must be between [0-255]

Код JavaScript для проверки IP-адреса

function ValidateIPaddress(ipaddress) {  
  if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress)) {  
    return (true)  
  }  
  alert("You have entered an invalid IP address!")  
  return (false)  
}  
37 голосов
/ 19 октября 2014

Попробуйте, это более короткая версия:

^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$

Объяснил:

^ start of string
  (?!0)         Assume IP cannot start with 0
  (?!.*\.$)     Make sure string does not end with a dot
  (
    (
    1?\d?\d|   A single digit, two digits, or 100-199
    25[0-5]|   The numbers 250-255
    2[0-4]\d   The numbers 200-249
    )
  \.|$ the number must be followed by either a dot or end-of-string - to match the last number
  ){4}         Expect exactly four of these
$ end of string

Юнит-тест для консоли браузера:

var rx=/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/;
var valid=['1.2.3.4','11.11.11.11','123.123.123.123','255.250.249.0','1.12.123.255','127.0.0.1','1.0.0.0'];
var invalid=['0.1.1.1','01.1.1.1','012.1.1.1','1.2.3.4.','1.2.3\n4','1.2.3.4\n','259.0.0.1','123.','1.2.3.4.5','.1.2.3.4','1,2,3,4','1.2.333.4','1.299.3.4'];
valid.forEach(function(s){if (!rx.test(s))console.log('bad valid: '+s);});
invalid.forEach(function(s){if (rx.test(s)) console.log('bad invalid: '+s);});
16 голосов
/ 11 ноября 2016

Если вы используете nodejs, попробуйте:

require('net').isIP('10.0.0.1')

Документ net.isIP ()

16 голосов
/ 16 декабря 2010

У вашего регулярного выражения уже есть несколько проблем:

Во-первых, оно содержит точки.В регулярном выражении точка означает «соответствовать любому символу», где вам нужно сопоставить только фактическую точку.Для этого вам нужно избежать его, поэтому поставьте обратную косую черту перед точками.

Во-вторых, но вы сопоставляете любые три цифры в каждом разделе.Это означает, что вы будете сопоставлять любое число от 0 до 999, которое, очевидно, содержит много недопустимых номеров IP-адресов.

Это можно решить, сделав сопоставление номеров более сложным;на этом сайте есть другие ответы, которые объясняют, как это сделать, но, честно говоря, это не стоит усилий - по моему мнению, вам будет гораздо лучше разбить строку по точкам, а затем просто проверить четыре блока как числовыецелочисленные диапазоны - то есть:

if(block > 0 && block <256) {....}

Надеюсь, что поможет.

15 голосов
/ 16 декабря 2010

Попробуйте это .. Источник от здесь .

"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
10 голосов
/ 31 января 2014

Если вы хотите что-то более читаемое, чем регулярное выражение для ipv4 в современных браузерах, вы можете пойти с

function checkIsIPV4(entry) {
  var blocks = entry.split(".");
  if(blocks.length === 4) {
    return blocks.every(function(block) {
      return parseInt(block,10) >=0 && parseInt(block,10) <= 255;
    });
  }
  return false;
}
4 голосов
/ 04 ноября 2016
/^(?!.*\.$)((?!0\d)(1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/

Полный кредит Ориадам . Я бы прокомментировал ниже его / ее ответ, чтобы предложить изменение двойного нуля, которое я сделал, но у меня еще недостаточно репутации здесь ...

изменение

4 голосов
/ 18 февраля 2019

В приведенном ниже решении не допускается заполнение нулями

Вот самый простой способ проверки IP-адреса. Давайте разберем его:

Факт: действительный IP-адрес имеет 4 octets, каждый октет может быть числом от 0 - 255

Распределение регулярных выражений.

  • 25[0-5] соответствует 250 - 255
  • 2[0-4][0-9] совпадений 200 - 249
  • 1[0-9][0-9] совпадений 100 - 199
  • [1-9][0-9]? совпадений 1 - 99
  • 0 совпадений 0

Примечания: При использовании new RegExp следует использовать \\. вместо \., поскольку строка будет экранирована дважды.

function isValidIP(str) {
  const octet = '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)';
  const regex = new RegExp(`^${octet}\\.${octet}\\.${octet}\\.${octet}$`);
  return regex.test(str);
}
3 голосов
/ 01 ноября 2013

Регулярное выражение для формата IP-адреса:

/^(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])$/;
3 голосов
/ 01 августа 2016

Не пишите свое собственное регулярное выражение или скопируйте! Вероятно, вы не охватите все ребра (IPv6, но также восьмеричные IP и т. Д.). Используйте is-ip от npm:

var isIp = require('is-ip');

isIp('192.168.0.1');

Вернет логическое значение.

Downvoters : хотите объяснить, почему использование активно поддерживаемой библиотеки лучше, чем копирование с веб-сайта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...