Без использования регулярных выражений.
Пишет мне один старый товарищ, ныне студент, и просит регулярку для проверки валидности IP. Как выяснилось, регулярка оказалась не нужна совсем, т.к. задача поиска IP в тексте неизвестной структуры не стояла. А что такое IP? Да это же просто 4 байта, разделенных точкой. Посему достаточно просто разложить строку на составляющие функцией split()
, проверить, сколько строк получилось в результате, и если строк 4 — попытаться каждую сконвертировать в байт. Если все сконвертировались — IP правильный.
bool isValidIP(string IPAddress)
{
char[] ch = new char[1]; //Разделители для функции split
ch[0] = '.'; //у нас 1 - точка
string[] IPArr = IPAddress.Split(ch); //разделяем строку на составляющие и записываем в массив
if (IPArr.Length != 4) return false; //если длина не 4 ровно, значит точно не IP
byte b = 0; //временная переменная для результата конверсии
bool res = false;//временная переменная флага, прошла ли конверсия удачно
for (int i = 0; i < 4; i++) //прогоняем все элементы массива через конверсию
{
res = byte.TryParse(IPArr[i], out b); //пытаемся сконвертировать
if (!res) return false; //если функция вернула false, значит элемент массива не байт. Возвращаем false
}
return true; //если до этого нигде не вывалились, это IP, возвращаем true
}
Вариант проверки с использованием класса Convert
и обработкой исключений:
bool isValidIP2(string IPAddress)
{
char[] ch = new char[1]; //Разделители для функции split
ch[0] = '.'; //у нас 1 - точка
string[] IPArr = IPAddress.Split(ch); //разделяем строку на составляющие и записываем в массив
if (IPArr.Length != 4) return false; //если длина не 4 ровно, значит точно не IP
byte b = 0; //временная переменная для результата конверсии
for (int i = 0; i < 4; i++) //прогоняем все элементы массива через конверсию
{
try
{
b = Convert.ToByte(IPArr[i]); //пытаемся сконвертировать
}
catch
{
return false; //если исключение - возвращаем false
}
}
return true; //если до этого нигде не вывалились, это IP, возвращаем true
}
Вариант 1 на pastebin
Вариант 2 на pastebin
демо
static class с функциями отдельно
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/291094.html
Прокомментировать заметку можно по ссылке выше.