2012-10-31 3 views
2

Je suis en train d'avoir mon regex correspondent à ce qui suit:Comment faire correspondre les adresses IPv4

169.254.0.0-169.254.254.255 

Quelqu'un pourrait-il s'il vous plaît aider comment puis-je parvenir.

jusqu'à présent, j'ai ceci:

169\.254\.([1-9]{1,2}|[1-9]{1,2}[1-4]) 

mais il serait également ramasser 169.254.255.1 qui ne devrait pas être l'un des matches.

Aidez s'il vous plaît!

grâce

Répondre

2

la regex ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]) correspond 0-254.

voir this page pour une discussion plus

+0

son correspondant 169.254.25 pour 169.254.255.1. Des pensées? – user1789564

+0

Je voudrais répéter le test deux fois, avec le chiffre final sur la 2ème section changé en 5 pour le match 255: '169 \ .254 \. ([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-4]) \. ([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]) ' – SeanC

+0

merci beaucoup, celui-ci semble bien fonctionner. – user1789564

4

Ceci est l'expression rationnelle que j'utilise pour la validation IP générale:

(([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))[.]?){4} 

Répartition:

1.`[0-9](?!\d)`  -> Any Number 0 through 9 (The `(?!\d)` makes sure it only grabs stand alone digits) 
2.`|[1-9][0-9](?!\d)` -> Or any number 10-99 (The `(?!\d)` makes sure it only grabs double digit entries) 
3.`|1[0-9]{2}`  -> Or any number 100-199 
4.`|2[0-4][0-9]`  -> Or any number 200-249 
5.`|25[0-5]`   -> Or any number 250-255 
6.`[.]?`    -> With or without a `.` 
7.`{4}`    -> Lines 1-6 exactly 4 times 

Cela n'a pas échoué mon encore pour l'adresse IP validation.

Pour votre cas, cela devrait le faire:

(169\.254\.)((([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}|2[0-4][0-9]|25[0-4])[.])(([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}|2[0-4][0-9]|25[0-5]))) 

Ceci est très long parce que je ne pouvais pas comprendre comment obtenir 169.254 (0-254) 0,255 pour vérifier sans se 169,254.. 255,1 à l'échec

Edit: Correction en raison de commentaires

+0

+1 beaucoup plus complet que ma réponse – SeanC

+1

N'applique pas les points entre les octets - c.-à-d. Qu'il correspond par erreur: '1111111111',' 100.1111111', etc. – ridgerunner

+0

Oui, j'ai ajusté le 2ème pour son cas pour forcer le '.' entre les octets, mais pour le primaire je ne veux pas le forcer. Pour le principal, c'est un compromis, parce que je devrais presque doubler la taille de l'expression rationnelle pour forcer le «.» Entre les octets. J'ai trouvé plus facile de vérifier le format de ###. ###. ###. ### 'avant de vérifier la validité de l'adresse IP elle-même que de vérifier l'adresse IP et le' .' en même temps.Dans mon environnement, j'ai beaucoup plus de contrôle sur l'entrée, et je vérifie principalement pour m'assurer qu'un '523' n'a pas été entré dans une feuille de calcul au lieu d'un' 253'. – Nick

1

J'ai écrit un article qui fournit des expressions régulières pour tous les composants d'un URI générique (tel que défini dans RFC3986: Uniform Resource Identifier (URI): Generic Syntax)

Voir: Regular Expression URI Validation

L'un des composants d'un URI générique est une adresse IPv4. Voici le mode libre-spacing version Python de cet article:

re_python_rfc3986_IPv4address = re.compile(r"""^
    # RFC-3986 URI component: IPv4address 
    (?: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) \.){3} # (dec-octet "."){3} 
     (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)   # dec-octet "." 
    $ """, re.VERBOSE) 

Et la version JavaScript non commenté:

var re_js_rfc3986_IPv4address = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
Questions connexes