Validation des adresses IPv4 avec regexp

j'ai essayé d'obtenir un regex efficace pour la validation IPv4, mais sans beaucoup de chance. Il m'a semblé à un moment que j'en avais eu!--1-->, mais il produit des résultats étranges:

[chris@helios bashscripts]$ grep --version
grep (GNU grep) 2.7


[chris@helios bashscripts]$ grep -E 'b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(.|$)){4}b' <<< 192.168.1.1
192.168.1.1
[chris@helios bashscripts]$ grep -E 'b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(.|$)){4}b' <<< 192.168.1.255
192.168.1.255
[chris@helios bashscripts]$ grep -E 'b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(.|$)){4}b' <<< 192.168.255.255
[chris@helios bashscripts]$ grep -E 'b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(.|$)){4}b' <<< 192.168.1.2555
192.168.1.2555

j'ai fait une recherche pour voir si cela avait déjà été demandé et répondu, mais d'autres réponses semblent simplement montrer comment déterminer 4 groupes de 1-3 nombres, ou ne pas travailler pour moi.

des idées? Merci!

37
demandé sur Matthieu Cartier 2011-03-12 20:27:24

26 réponses

vous avez déjà une réponse de travail mais juste au cas où vous êtes curieux de savoir ce qui n'allait pas avec votre approche originale, la réponse est que vous avez besoin de parenthèses autour de votre alternance autrement le (\.|$) n'est nécessaire que si le nombre est inférieur à 200.

'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'
    ^                                    ^
52
répondu Mark Byers 2011-03-12 18:08:06

^((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]?)$

Accepter:

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01

Rejeter l':

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
3...3

Essayer en ligne avec des tests unitaires: https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1

39
répondu Sllouyssgort 2015-10-13 07:55:37

Regex n'est pas l'outil pour ce travail. Il serait mieux d'écrire un analyseur syntaxique qui sépare les quatre numéros et vérifie qu'ils sont dans l'intervalle [0,255]. Le regex non fonctionnel est déjà illisible!

18
répondu Tim 2011-03-12 17:31:33

adresse IPv4 (capture précise )) Matches 0.0.0.0 à 255.255.255.255 Utilisez ce regex pour faire correspondre les numéros IP avec accurracy. Chacun des 4 nombres est stocké dans un groupe de capture, de sorte que vous pouvez y accéder pour un traitement ultérieur.

\b
(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]?)\.
(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]?)
\b

extrait de la bibliothèque JGsoft RegexBuddy

Edit:(\.|$) partie semble bizarre

9
répondu Valerij 2011-03-12 17:33:27

j'étais à la recherche de quelque chose de similaire pour les adresses IPv4 - un regex qui a également empêché les adresses ip privées couramment utilisées d'être validées (192.168.x.y, 10.x.y.z, 172.16.x.y) donc utilisé des têtes de regard négatives pour accomplir ceci:

(?!(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.).*)
(?!255\.255\.255\.255)(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|[1-9])
(\.(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|\d)){3}

(ceux-ci doivent être sur une ligne bien sûr, formatés pour des raisons de lisibilité sur 3 lignes distinctes) Regular expression visualization

Debuggex Demo

il peut ne pas être optimisé pour la vitesse, mais fonctionne bien quand Je ne cherche que de "vraies" adresses internet.

Choses qui va (et doit) l'échec:

0.1.2.3         (0.0.0.0/8 is reserved for some broadcasts)
10.1.2.3        (10.0.0.0/8 is considered private)
172.16.1.2      (172.16.0.0/12 is considered private)
172.31.1.2      (same as previous, but near the end of that range)
192.168.1.2     (192.168.0.0/16 is considered private)
255.255.255.255 (reserved broadcast is not an IP)
.2.3.4
1.2.3.
1.2.3.256
1.2.256.4
1.256.3.4
256.2.3.4
1.2.3.4.5
1..3.4

IPs qui va (et doit) de travail:

1.0.1.0         (China)
8.8.8.8         (Google DNS in USA)
100.1.2.3       (USA)
172.15.1.2      (USA)
172.32.1.2      (USA)
192.167.1.2     (Italy)

fourni dans le cas où quelqu'un d'autre est à la recherche de valider 'adresses IP Internet n'incluant pas les adresses privées communes'

4
répondu PhillipHolmes 2016-04-21 08:03:42

Nouveau et amélioré version plus courte

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

Il utilise l'anticipation négatif (?!) pour supprimer le cas où l'ip peut se terminer par un .

ancienne réponse

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

je pense que c'est la plus précise et stricte regex, il ne veut pas accepter les choses comme 000.021.01.0. il semble que la plupart des autres réponses ici le font et nécessitent regex supplémentaire pour rejeter les cas similaires à celui-ci-c.-à-d. 0 démarrage des nombres et une ip qui se termine par un .

4
répondu Danail Gabenski 2017-10-31 12:12:52

C'est un peu plus que certains mais c'est ce que j'utilise pour faire correspondre les adresses IPv4. Simple et sans compromis.

^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$
2
répondu Mickstar 2017-12-24 09:13:28

j'ai réussi à construire une regex de toutes les autres réponses.

(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)(\.(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)){3}
1
répondu Vicky 2015-10-12 11:52:02

Avec le masque de sous-réseau :

^$|([01]?\d\d?|2[0-4]\d|25[0-5])\
.([01]?\d\d?|2[0-4]\d|25[0-5])\
.([01]?\d\d?|2[0-4]\d|25[0-5])\
.([01]?\d\d?|2[0-4]\d|25[0-5])
((/([01]?\d\d?|2[0-4]\d|25[0-5]))?)$
1
répondu hsuk 2018-04-05 15:33:51
(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2})))

Essai de trouver des correspondances dans le texte, https://regex101.com/r/9CcMEN/2

Voici les règles définissant les combinaisons valides dans chaque numéro D'une adresse IP:

  • N'importe quel nombre à un ou deux chiffres.
  • tout nombre à trois chiffres commençant par 1.

  • tout nombre à trois chiffres commençant par 2 si le deuxième chiffre est 0 travers 4.

  • tout nombre à trois chiffres commençant par 25 si le troisième chiffre est 0 5.

commençons par (((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.), un ensemble de quatre sous-expressions imbriquées, et nous les regarderons dans l'ordre inverse. (\d{1,2}) correspond à un ou deux chiffres ou des nombres 099. (1\d{2}) correspond à tout nombre à trois chiffres commençant par