Pour y parvenir à l'aide d'une expression régulière, il faut s'assurer que l'ensemble du quadrant pointé IPv4 représente un nombre de 32 bits avec uniquement des uns en tête. Il ne suffit pas de s'assurer que chaque chiffre du quadrant ne comporte que des uns en tête. Par exemple, 255.192.255.0 n'est pas un sous-masque valide, même si chaque chiffre du quadrant ne comporte que des uns en tête. En s'appuyant sur la solution proposée par @xanatos,
var leadingOnes = new Regex("255|254|252|248|240|224|192|128|0+");
définit une expression régulière qui correspondra à n'importe quel nombre de 8 bits (décimal) avec uniquement des uns en tête. J'ai utilisé "0+" pour tenir compte de .000, qui est parfois utilisé dans les quads. Évidemment, si vous voulez forcer un seul zéro, utilisez "0" à la place.
Vous devez ensuite construire une expression régulière qui correspond à l'un des quatre motifs suivants, que je représente sous forme de pseudo-expressions régulières pour faciliter la compréhension :
- 255.255.255. leadingOnes
- 255.255. leadingOnes *.0
- 255. leadingOnes .0.0
-
leadingOnes .0.0.0
Vous pouvez soit l'écrire sous forme de chaîne unique, soit la construire par concaténation. Voici la construction :
var leadingOnes = "(255|254|252|248|240|224|192|128|0+);"
var allOnes = @"(255\.)";
var re = new Regex("^((" + allOnes + "{3}" + leadingOnes + ")|" +
"(" + allOnes + "{2}" + leadingOnes + @"\.0+)|" +
"(" + allOnes + leadingOnes + @"(\.0+){2})|" +
"(" + leadingOnes + @"(\.0+){3}))$");
Et voici la chaîne entière, si on ignore les sauts de ligne.
var re = new Regex(@"^(((255\.){3}(255|254|252|248|240|224|192|128|0+))|((255\.){2}(255|254|252|248|240|224|192|128|0+)\.0)|((255\.)(255|254|252|248|240|224|192|128|0+)(\.0+){2})|((255|254|252|248|240|224|192|128|0+)(\.0+){3}))$");
En suivant la suggestion de @Keith, vous pourriez commencer par une simple expression régulière telle que
Regex("([0-9]{1,3}\.){3}[0-9]{1,3}"
pour obtenir quatre nombres à trois chiffres séparés par des points, puis écrivez une fonction qui extrait et évalue les quatre morceaux dans un entier de 32 bits que vous vérifiez ensuite pour vous assurer qu'il ne contient que des uns de tête. Il existe plusieurs façons de le faire, mais toutes nécessitent jusqu'à 31 opérations de comparaison pour compléter la validation.