9 votes

Expression régulière pour le masquage de sous-réseau ?

J'utilise une expression régulière pour vérifier le masquage du sous-réseau. J'utilise une boîte de texte ajax avec une valeur de masquage, mais cela ne fonctionne pas, puis je suis passé à une boîte de texte et à l'application d'une expression régulière pour cela. Malheureusement, cela ne fonctionne pas non plus.

Pouvez-vous m'aider à donner un RE pour le masquage de sous-réseau 255.255.255.255

Ou une meilleure façon de le faire ?

Solution :

J'ai utilisé une zone de texte masquée et je ne sais pas comment mettre l'expression de validation.

Finalement, j'ai trouvé une propriété de la zone de texte masquée comme expression de validation, et là j'ai mis le RE et changé la propriété validate en true.

Il n'est pas nécessaire d'utiliser explicitement l'expression du validateur.

Gracias

0voto

kburbach Points 486

Explication

J'arrive un peu tard dans la soirée, mais nous ne pouvons pas faire une simple vérification regex sur les octets valides parce que.. :

  1. Un sous-réseau doit commencer par 255.X.X.X
  2. Un sous-réseau ne peut pas ressemble à ceci : 255.254.128.X - une fois qu'il y a un bit 0, tout le reste doit être 0 ensuite.

La façon correcte de procéder est de parcourir les bits à partir du MSB, en vérifiant le premier bit 0. Une fois que vous avez découvert le premier bit 0, vérifiez dans quelle position il se trouve. Le plus grand sous-réseau légal est un /8, ou 255.0.0.0, ce qui signifie qu'il doit y avoir 8 bits 1 avant le premier zéro. Ensuite, il faut s'assurer que chaque bit après le premier 0 est un zéro. Donc en résumé :

  1. (En option, vérifiez qu'il s'agit bien d'une adresse IP valide...)

  2. Commencez au MSB, descendez les bits en cherchant le premier 0.

  3. Si vous trouvez un 0 (255.255.255.255 serait encore valide), vérifiez la position

  4. Vérifiez que tous les bits restants sont nuls

Code

    private bool IsValidSubnet(string subnet)
    {
        //A subnet is a valid ipv4 address, so start checking there
        if (!IsIPv4(subnet)) return false;

        // Get the 4 bytes
        byte[] subnetMaskBytes =
                    System.Net.IPAddress.Parse(subnet).GetAddressBytes();

        //Shift to get uint representation of the bits
        var UintSubnet = (uint)subnetMaskBytes[0] << 24;
        UintSubnet += (uint)subnetMaskBytes[1] << 16;
        UintSubnet += (uint)subnetMaskBytes[2] << 8;
        UintSubnet += (uint)subnetMaskBytes[3];

        int i = 31;
        while (i >= 0)
        {
            UInt32 mask = (UInt32)(1 << i);
            if ((UintSubnet & mask) == 0) break;
            i--;
        }

        // It is not legal to have fewer than 8 bits of addressing
        if (i >= 24) return false;

        // Make sure that all remaining bits are 0
        while (i >= 0)
        {
            UInt32 mask = (UInt32)(1 << i);
            if ((UintSubnet & mask) != 0) return false;
            i--;
        }
        return true;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X