Как я могу определить, является ли строка IP-адресом? Либо IPv4, либо IPv6?
Какое наименьшее и наибольшее количество символов?
Я предполагаю, что это будет ответ регулярное выражение.





Для 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-адреса.
Что-то вроде этого:
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)
}
@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
В .NET есть тип IPAddress, который имеет удобный метод 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)
}
Я делал это раньше, но мне нравится пост Раймонда Чена по адресу:
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;
}
Гораздо проще посмотреть на это и понять, что он должен делать.
IPv4 становится: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/
Я не уверен в правилах IPv6.
Я тестировал его на разных входах. Кажется пуленепробиваемым.