Проверка правильности ввода IP-адреса пользователем
в настоящее время я работаю над проектом C#, где мне нужно проверить текст, введенный пользователем в текстовое поле.
одной из необходимых проверок является проверка правильности ввода IP-адреса.
Как я могу выполнить эту проверку IP-адреса.
Спасибо за любую помощь вы можете предоставить.
6 ответов
похоже, что вас интересует только проверка строк IP-адресов IPv4 в формате X. X. X. X. Если это так, этот код прямо вперед для этой задачи:
string ip = "127.0.0.1";
string[] parts = ip.Split('.');
if (parts.Length < 4)
{
// not a IPv4 string in X.X.X.X format
}
else
{
foreach(string part in parts)
{
byte checkPart = 0;
if (!byte.TryParse(part, out checkPart))
{
// not a valid IPv4 string in X.X.X.X format
}
}
// it is a valid IPv4 string in X.X.X.X format
}
можно использовать IP-адрес.Метод синтаксического анализа .NET Framework 1.1. Или, если вы используете .NET 4.0, см. документацию для IP-адрес.Метод TryParse .NET Framework 4.
этот метод определяет, является ли содержимое строки допустимым IP-адресом. В .NET 1.1 возвращаемым значением является IP-адрес. В .NET 4.0 возвращаемое значение указывает на успех / сбой, а IP-адрес возвращается в IPAddress, переданном как в методе вызов.
edit: хорошо, я буду играть в игру для bounty :) вот пример реализации в качестве метода расширения, требующего C# 3+ и .NET 4.0:
using System;
using System.Net;
using System.Text.RegularExpressions;
namespace IPValidator
{
class Program
{
static void Main (string[] args)
{
Action<string> TestIP = (ip) => Console.Out.WriteLine (ip + " is valid? " + ip.IsValidIP ());
TestIP ("99");
TestIP ("99.99.99.99");
TestIP ("255.255.255.256");
TestIP ("abc");
TestIP ("192.168.1.1");
}
}
internal static class IpExtensions
{
public static bool IsValidIP (this string address)
{
if (!Regex.IsMatch (address, @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"))
return false;
IPAddress dummy;
return IPAddress.TryParse (address, out dummy);
}
}
}
Если вы хотите увидеть, действительно ли существует IP-адрес, вы можете использовать класс Ping.
ответ insta был ближе, прежде чем он добавил неправильное регулярное выражение.
public static bool IsValidIP(string ipAddress)
{
IPAddress unused;
return IPAddress.TryParse(ipAddress, out unused);
}
или поскольку OP не хочет включать целочисленные адреса IPv4, которые не являются полными пунктирными квадратиками:
public static bool IsValidIP(string ipAddress)
{
IPAddress unused;
return IPAddress.TryParse(ipAddress, out unused)
&&
(
unused.AddressFamily != AddressFamily.InterNetwork
||
ipAddress.Count(c => c == '.') == 3
);
}
тестирование:
IsValidIP("fe80::202:b3ff:fe1e:8329")
возвращает true
(правильный).
IsValidIP("127.0.0.1")
возвращает true
(правильный).
IsValidIP("What's an IP address?")
возвращает false
(правильный).
IsValidIP("127")
возвращает true
С первой версией, false
С второй (правильный.)
IsValidIP("127.0")
возвращает true
С первой версией, false
со вторым (правильно).
Я бы использовал регулярное выражение.
^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$
используя именованные группы, это может быть яснее. Это написано на Рубине. Я не знаю C#, но я думаю, что поддержка регулярных выражений в этом языке и что именованные группы могут существовать.
/(?<number>(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){0}^(\g<number>\.){3}\g<number>$/
вот мое решение:
using System.Net.NetworkInformation; using System.Net;
/// <summary>
/// Return true if the IP address is valid.
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public bool TestIpAddress (string address)
{
PingReply reply;
Ping pingSender = new Ping ();
try
{
reply = pingSender.Send (address);
}
catch (Exception)
{
return false;
}
return reply.Status == IPStatus.Success;
}