Как оценить IP? - PullRequest
       46

Как оценить IP?

8 голосов
/ 03 сентября 2008

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

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

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

Ответы [ 8 ]

6 голосов
/ 03 сентября 2008

В .NET есть тип IP-адреса, который имеет удобный метод TryParse .

Пример:

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

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}
6 голосов
/ 03 сентября 2008

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

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;
}

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

4 голосов
/ 03 сентября 2008

Для 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.

3 голосов
/ 03 сентября 2008

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

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

0 голосов
/ 04 сентября 2008

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

Я не уверен в правилах IPv6.

0 голосов
/ 03 сентября 2008

@ 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
0 голосов
/ 03 сентября 2008

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

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

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

0 голосов
/ 03 сентября 2008

Поскольку половина этого регулярного выражения обрабатывает тот факт, что последний сегмент не имеет периода в конце, вы можете сократить его пополам, если выберете '.' до конца вашего возможного 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...