Проверка правильности ввода 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;
    }