2010-06-08 7 views
6

J'essaie d'utiliser un RegularexpressionValidator pour faire correspondre une adresse IP (avec des caractères génériques possibles) pour un système de filtrage IP.Expression régulière pour correspondre à adresse IP + caractère générique

J'utilise l'expression rationnelle suivante:

"([0-9]{1,3}\\.|\\*\\.){3}([0-9]{1,3}|\\*){1}" 

Ce qui fonctionne très bien quand il en cours d'exécution en LINQPad avec Regex.Matches, mais ne semble pas fonctionner lorsque j'utilise le validateur.

Est-ce que quelqu'un a une suggestion quant à une meilleure Regex ou pourquoi cela fonctionnerait en test mais pas sur place?

Cheers, Ed

+0

Pouvez-vous fournir quelques cas de test où il ne correspond pas correctement? – VeeArr

+0

@VeeArr Je n'ai pas encore réussi à le valider correctement, donc toute chaîne arbitraire, y compris les adresses IP: D –

Répondre

3

asp:RegularExpressionValidator ne vous oblige pas à double-échappement anti-slash. Vous devriez essayer:

([0-9]{1,3}\.|\*\.){3}([0-9]{1,3}|\*){1}

+0

Salutations mec! :) –

1

Comment mettre sur les caractères de début et de fin de chaîne sur l'expression

^([0-9]{1,3}\\.|\\*\\.){3}([0-9]{1,3}|\\*){1}$ 
+0

Bonne suggestion mais j'ai peur que ça ne valide toujours pas! –

2

[0-9] {1,3} permettrait des adresses IP de la forme 999.999.999.999. Votre plage d'adresses IP devrait permettre seulement 0-255.
Remplacer toutes les occurrences de [0-9] {1,3} par ([0-9] {1,2}) | (1 [0-9] {2,2}) | (2 [0- 4] [0-9]) | (25 [0-5])
Cela me semble très compliqué, et il y a probablement de meilleures façons de le faire, mais cela semble correct à première vue.

+1

Je ne suis pas énervé massivement au sujet de l'adresse IP réelle étant valide, seulement le format (il est plus facile d'analyser plus tard), mais point pris. –

5

Ceci: \\.|\\*\\. ressemble à l'peu douteuse. Pour ce faire, à la place:

@"^(([0-9]{1,3}|\*)\.){3}([0-9]{1,3}|\*)$" 

Et d'accepter que 0-255 (merci, apoorv020):

^((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5])|\*)\.){3}(([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5])|\*)$ 
+0

Une autre bonne suggestion, mais j'ai peur que ça ne marche pas non plus! –

+0

Il fait - essayez-le à http://gskinner.com/RegExr/. Assurez-vous d'avoir un '@' devant la chaîne. Si cela ne fonctionne toujours pas, montrez-nous le code que vous utilisez pour le faire correspondre. Notez que j'essaie de faire correspondre à des choses comme '192.168. *. * Et' 10. *. *. * '- est ce que vous voulez?Pouvez-vous nous montrer quelques cas de test? –

+0

Je ne pense pas que vous avez bien lu ma question: mon Regex original correspond à une adresse IPv4 avec des caractères génériques, mais cela ne fonctionnera pas dans un ASP: RegularExpressionValidator. Votre Regex a exactement le même problème. –

0

Ma réponse est générale pour .NET, et non RegularExpressionValidator Spécifiques.

Chaîne regex pour IP (utiliser ExplicitCapture pour éviter la capture inutile et garder RE concis):

"\\b0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})(\\.0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})){3}\\b" 

Selon le cas d'utilisation particulière, vous pouvez ajouter des points d'ancrage appropriés, c.-à-\A ou ^ au début et \Z ou $ à la fin. Ensuite, vous pouvez supprimer l'exigence de limites de mots: \b.

(Rappelez-vous de doubler \ dans la chaîne)

Questions connexes