2010-11-03 5 views
1

Je suis après une expression régulière pour analyser les adresses IP et extraire leur hôte, port, nom d'utilisateur et mot de passe.expression régulière pour analyser IP

Voici les formats que je suis intéressé par:

+7

'http: // ...' est pas un Adresse IP mais un URI. – Gumbo

+3

789 n'est pas un octet valide. Aussi: qu'avez-vous essayé jusqu'à présent? –

+0

Quelle langue utilisez-vous? Les chances sont il ya déjà une meilleure solution que d'écrire votre propre expression régulière – Gareth

Répondre

1

Vous pouvez commencer avec ce (python):

import re 

pattern = "((?P<login>\w+):(?P<password>\w+)@)?(?P<ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})(:(?P<port>\d+))?" 

re.match(pattern, "12.34.56.789").groupdict() 
re.match(pattern, "12.34.56.789:80").groupdict() 
re.match(pattern, "john:[email protected]:80").groupdict() 

Et évidemment, l'adresse IP spécifiée est non valide (comme Matt dit ...)

+0

nice, les attributs nommés rendent cela plus facile à travailler avec – hoju

0

Regexlib serait une ressource utile pour votre question. Vous pouvez trouver de nombreuses solutions (il se peut que vous deviez en combiner quelques-unes)

4

Il se peut que cette méthode ne soit pas recommandée. Il pourrait être préférable de se brancher sur une sorte de code avec réel en elle, qui peut effectuer l'analyse URI à des fins générales. Si vous avez des besoins limités, cependant, et pouvez commenter/documenter en profondeur que votre code va se casser si vous en demandez plus, alors peut-être que c'est logique de suivre ce chemin.

Le plus simple est de faire correspondre quatre ensembles de 1 à 3 chiffres, avec:

  • éventuellement, un ou plusieurs pas- :, plus:, plus un ou plusieurs pas- @, Plus @
  • en option,:, plus 1 à 5 chiffres

Quelque chose comme:

([^:]+:[^@][email protected])?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})? 

Mais accepterait des choses stupides, comme « 999.999.999.999:99999 »

Si vous ne souhaitez que d'accepter adresses valides IP, et ne se soucient pas que cela arrive à faire partie d'un URI, ou ne se soucient pas ce que existe d'autres déchets dans la chaîne , voici un exemple:

http://www.regular-expressions.info/examples.html

Il correspond essentiellement quatre ensembles de:

  • 2, plus 0-4, plus 0-9
  • ou 2, plus 5, plus 0-5
  • ou 1, plus 0-9, plus 0-9
  • ou 1-9, plus 0-9
  • ou 0-9

Cela devrait vous commencer.

  • éventuellement, un ou plusieurs pas- :, plus:, plus un ou plusieurs pas- @, plus @ (longueurs max peut être intéressant, ici)
  • éventuellement,:, plus 0 -65535 (ceci je vais laisser à vous, basé sur les règles 0-255 ci-dessus)

Il existe d'autres règles basées sur la gamme pour les adresses IP correspondant que vous pourriez vouloir éviter (des choses comme 0.0.0.0 et gammes réservées), mais il peut être plus facile d'effectuer une correspondance ultérieure pour ceux-ci. Fondamentalement, je suggère que vous utilisiez l'exemple très simple, ou branchez dans une bibliothèque.

+0

+1 Je n'ai pas remarqué cela avant de poster le mien – Philar

+0

Cela bénéficierait énormément de étant dans le mode '(? x)' de sorte que vous pouvez obtenir une marge de manœuvre pour la segmentation cognitive même si vous n'incluez pas de commentaires réels. – tchrist

+0

@tchrist: Je n'ai aucune idée de ce dont vous parlez, mais cela semble intéressant :) Est-ce en référence à perl? grep? –

7

Essayez quelque chose comme ça

(http://(\w+:\[email protected])?)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})? 

Explication:

(http://(\w+:\[email protected])?)? - optional group of http:// followed by optional user:[email protected] 
(\d{1,3}\.){3} - three groups of one to three digits followed by a dot 
\d{1,3} - one to three digits 
(:\d{1,5})? - optional group of colon followed by one to five digits 
+0

il serait beaucoup mieux si vous spécifiez que ip est un nombre dans (1-255) ne commence pas par 0 et plus de 255 .. – jargalan

+0

Oui, il n'est pas très robuste. Voir le lien fourni par Merlyn pour quelques exemples de comment autoriser seulement certaines combinaisons de chiffres si nécessaire. –

+0

+1, j'ai une bonne partie de cette implémentation dans ma réponse (que j'ai compris moi-même), mais je l'ai "débuggé" en la comparant à cette réponse;) (j'avais le nom d'utilisateur: mot de passe @ syntaxe en arrière, lol). Celui-ci est quand même meilleur, je préfère le \ w, et le mien n'a pas l'option http: //. L'explication est également plus propre. –

2

Voici un petit script fouetté en perl qui fait les choses suivantes a) Strips sur le nom d'utilisateur et mot de passe après avoir vérifié que les anciens commence par un caractère b) ne valident pas l'adresse IP c) port validé

#!/usr/bin/perl 

    while (<>) { 
    chomp; 
      if (/(?:(?:([a-zA-z]\w+)\:(\w+))@)?((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))(?:\:(\d{1,5}))?/) { 
        print "username=$1\n"; 
        print "password=$2\n"; 
        print "ip address=$3\n"; 
        print "port=$8\n"; 
        print "Warning: IP Address invalid\n" if ($4>255||$5>255||$6>255||$7>255); 
        print "Warning: Port Address invalid\n" if ($8>65535); 
      } 
    } 

EDIT: Recommandation de tchrist ci-dessous

+1

Vous n'avez pas besoin de mentionner '\ d' si vous avez déjà' \ w': c'est redondant. – tchrist

+0

@tchrist danke :) – Philar

+1

Vous pouvez écrire '[\ w] +' juste comme '\ w +' maintenant que vous n'avez pas deux choses à sélectionner. De même, '[a-z] [A-Z]' * pourrait être mieux écrit comme n'importe quel caractère avec la propriété "Letter" Unicode, qui est '\ p {Letter}' ou '\ pL' pour faire court. – tchrist

0

pour une utilisation exclusivement correspondance adresse IP valide

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3} 

au lieu de

([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3} 

parce que beaucoup moteur regex correspondent à la première possibilité dans la séquence OU

vous pouvez essayer votre moteur de regex: 10.48.0.200

Questions connexes