Вопрос

Как я могу определить, является ли строка IP-адресом?Либо IPv4 или IPv6?

Каково наименьшее и наибольшее количество символов?

Я предполагаю, что это было бы регулярное выражение отвечай.

Это было полезно?

Решение

Но вопрос не так прост, как можно предположить a.b.c.d ... существует гораздо больше форм, чем вы предполагали.

Но, конечно же, это вопрос Google for it?В значительной степени каждый regex primer, который вы можете найти где угодно, использует IP в качестве примера! ipv4 + регулярное выражение набирает 183 000 просмотров!

Другие советы

Я делал это раньше, но мне нравится пост Рэймонда Чена в:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

Где он в основном выступает за использование регулярных выражений для того, в чем они хороши:разбор токенов.Затем оцените полученные результаты.Его пример:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

Гораздо проще посмотреть на это и понять, что оно должно делать.

В .NET есть тип IPAddress, который имеет удобный метод Попробуйте проанализировать.

Пример:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

Для IPv4 вы можете использовать это регулярное выражение.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Это выглядит довольно сложно, но работает путем ограничения каждого квадрата числами 0-255.

@без лицензии:правда, эта проблема может немного свести с ума.

Если вам действительно нужно обработать любой возможный IP-адрес, то вам придется придумать что-то более сложное.

Однако, если вы просто хотите выполнить базовую проверку, чтобы убедиться, что пользователи вводят правильно отформатированные данные, я думаю, будет справедливо ограничить их моделью a.b.c.d с приведенными выше регулярными выражениями.

@unsliced это правильно, однако это, конечно, будет зависеть от реализации, если вы анализируете IP-адрес пользователя, посещающего ваш сайт, тогда вы можете использовать регулярное выражение, как и ДОЛЖНО быть в формате x.x.x.x .

Для IPv6 вы могли бы использовать это

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

однако он не улавливает все, потому что с IPv6 это намного сложнее, согласно википедии, все следующие примеры технически корректны, однако приведенное выше регулярное выражение улавливает только те, у которых *

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

Поскольку половина этого регулярного выражения учитывает тот факт, что в конце последнего сегмента нет точки, вы могли бы сократить его вдвое, если добавите "." в конец вашего возможного IP-адреса.

Что - то вроде этого:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

IPv4 становится: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

Я не уверен насчет правил IPv6.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top