web-dev-qa-db-fra.com

Expression régulière pour la validation d'adresse IP

je veux valider la valeur est adresse IP valide ou non ..!

J'ai l'habitude de valider comme 

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

ça marche bien, mais quand je donne les valeurs comme 12345678, il retourne aussi true .. Comment résoudre ce problème?

21

Il y a un moyen plus simple. Il vous suffit de scinder la chaîne sur . et de vérifier que chaque nombre est compris entre 0 et 255.

De plus, vous pouvez vérifier l'hexa et le fractionner sur : pour IPv6.


Juste parce que je pense que c'est drôle:

^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$

Voici une regex qui devrait gérer les IP (v4).

31
Colin Hebert

En cherchant un pour IPv4, j'ai fini par le créer moi-même. (Ceci ne traite que la variante commune avec points, à savoir 0.0.0.0 - 255.255.255.255)

^                           # START OF STRING
  (?=\d+\.\d+\.\d+\.\d+$)     # Lookahead, require this format: number.number.number.number END OF STRING
  (?:                         # Start non-capture group (number 0-255 + optional dot)
    (?:                         # Start non-capture group (number 0-255)
      25[0-5]                     # 250-255
      |                           # OR
      2[0-4][0-9]                 # 200-249
      |                           # OR
      1[0-9]{2}                   # 100-199
      |                           # OR
      [1-9][0-9]                  # 10-99
      |                           # OR
      [0-9]                       # 0-9
    )                           # End non-capture group
    \.?                         # Optional dot (enforced in correct positions by lookahead)
  ){4}                        # End non-capture group (number + optional dot), repeat 4 times
$                           # END OF STRING

Sans commentaire:

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

Un code pour le tester:

function isValidIpv4Addr(ip) {
  return /^(?=\d+\.\d+\.\d+\.\d+$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}$/.test(ip);
}
var testAddr = ['192.68.35.35','0.0.0.0','255.0.0.0','192.168.1.0','192.168.0.1','255.255.255.0','1.1.1.1','255.255.255.255','249.249.249.249','200.200.200.200','199.199.199.199','100.100.100.100','99.99.99.99','0.0.0.0','9.9.9.9','10.10.10.10','99.99.99.99','100.100.100.100','109.109.109.109','110.110.110.110','199.199.199.199','200.200.200.200','249.249.249.249','250.250.250.250','255.255.255.255','256.256.256.260','192.168.0.0/24','192.168..1','192.168.1','1','1.','1.1','1.1.','1.1.1','1.1.1.','1.1.1.1.','1.1.1.1.1','.1.1.1.1','01.01.01.01','09.09.09.09','1.0.0.1.0','010.1.1.1','123456','123123123123','.127.0.0.1'];
for (var i = 0; i < testAddr.length; i++) {
  document.getElementById('ipv4tests').innerHTML += '<li>' + testAddr[i] + ' ' + (isValidIpv4Addr(testAddr[i]) ? '<font color="green">VALID!</font>' : '<font color="red">INVALID!</font>') + '</li>';
}
<ul id="ipv4tests"></ul>

12
ohaal

Cela fonctionne correctement pour tous les cas possibles.

^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$
11
kirill.buga

Je sais que c'est vieux, mais essayez celui-ci:

    /^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)(?:\:(?:\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/

Je l'ai fait aujourd'hui pour une fonction en php.

Il gère les ip de 0.0.0.0 à 255.255.255.255 et les ports de 0 à 65535.

Exemples:

validates:
    0.0.0.0:0
    255.0.0.0
    192.168.1.0:8080
does not validate:
    192.168.0.0/24
    192.168..1
    192.168.1

Je sais que c'est un frankenregex, mais quand même, ça marche!

Si le port n'a pas d'importance, utilisez celui-ci:

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

Essayez celui-ci raccourci:

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

Voici le scénario de test pour cette expression rationnelle:

  function verifyIp(ip)
  {
    return /^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.(?!$)|(?=$))){4}$/.test(ip||"");
  }
  
  ["192.68.35.35","0.0.0.0","255.0.0.0","192.168.1.0","192.168.0.1","255.255.255.0","1.1.1.1","255.255.255.255","249.249.249.249","200.200.200.200","199.199.199.199","100.100.100.100","99.99.99.99","0.0.0.0","9.9.9.9","10.10.10.10","99.99.99.99","100.100.100.100","109.109.109.109","110.110.110.110","199.199.199.199","200.200.200.200","249.249.249.249","250.250.250.250","255.255.255.255","256.256.256.260","192.168.0.0/24","192.168..1","192.168.1","1","1.","1.1","1.1.","1.1.1","1.1.1.","1.1.1.1.","1.1.1.1.1",".1.1.1.1","01.01.01.01","09.09.09.09","1.0.0.1.0","010.1.1.1","123456","123123123123",".127.0.0.1"].forEach(function(item){
    is_valid = verifyIp(item);
    $('<div>'+item+' <span class="'+(is_valid?'correct':'wrong')+'">'+(is_valid?'VALID':'INVALID')+'</span></div>').appendTo('#result');
  });
.item {
  font-weight: bold;
}
.wrong {
  color: red;  
}

.correct {
  color: green;  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

3
Slavik Meltser

vous pouvez simplement utiliser cette expression rationnelle pour valider toute adresse IP sans numéro de port, comme ce format (192.168.1.1)

/^(?:(?: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]?)$/
1
Raad Altaie

Vous pouvez aussi essayer ceci:

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

Nous voulons que le motif se répète exactement quatre fois - dans ce cas, notre motif est un nombre compris entre 0 et 255, précédé d'un point . ou du début de la chaîne! Le début de la chaîne ne pouvant se produire qu’une seule fois, les trois autres occurrences doivent être des points.

S'il vous plaît voir cette démo de Regex 101 pour une explication complète.

1
David Faber

Cet ex-policier fonctionne bien, mais croyez-moi, c'est exagéré.
Pour avoir des comparaisons conditionnelles comme ici moins de 255, il est préférable d’avoir une combinaison de RegEx et de conditions.

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

Voici la solution: 

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

En prolongeant l’excellente solution de @DavidFaber. Pour faire correspondre une notation " en pointillé " IPv4 (sans plage/ports):

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

Exemples de correspondance:https://regex101.com/r/vX2hK4/15

Code de golf quelqu'un?

1
Nick Grealy
    import { Component } from '@angular/core';
    import { FormBuilder, FormGroup, Validators }   from '@angular/forms';

    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.scss'],
    })
    export class AppComponent {
      ipranging="";
      testForm1: FormGroup;
      testForm2: FormGroup;
      constructor(private fb: FormBuilder){

      }
      ngOnInit(): void {
        const ipPattern = 
        "(?:(?: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]?)";
        this.testForm1 = this.fb.group({
          inp: ['', Validators.pattern(ipPattern)],
          inp3: ['', Validators.pattern(ipPattern)]
        });
        this.testForm2 = this.fb.group({
          inp: ['', Validators.pattern(ipPattern)],
          inp2: ['', Validators.pattern(ipPattern)],
          inp3: ['', Validators.pattern(ipPattern)]
        });
        this.testForm2.setValidators(this.comparisionValidator);
      }

      public comparisionValidator(group: FormGroup) : any{

        const control1 = group.controls['inp'];
        const control2 = group.controls['inp2'];
        var control1array  = control1.value.split('.');
        var control2array = control2.value.split('.');

        if(parseInt(control1array[0]) > parseInt(control2array[0]) ){
          group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
          console.log(group); 
        }
        else if(parseInt(control1array[1]) > parseInt(control2array[1]) ){
          group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
          console.log(group); 
        }
        else if(parseInt(control1array[2]) > parseInt(control2array[2]) ){
          group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
          console.log(group); 
        }
        else if(parseInt(control1array[3]) > parseInt(control2array[3]) ){
          group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
          console.log(group); 
        }
        else {
          group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': false });
          console.log(group);
        }   
      }
    }
0
user11107730

IPv4 a 4 blocs de chiffres de 0 à 255 pouvant contenir des zéros à gauche. Chaque bloc est espacé d'un point.

Validateur IPv4 court et simple:

var block "([0-1]{0,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|)";
var ipv4 = "(" + block +"\\.){3}" + block ;

Valide toute adresse IP comme:

  • 000.12.12.034
  • 121.234.12.12
  • 23.45.12.56
  • 003.045.012.056
  • 03.45.12.6
  • 0.45.122.255
0
Dubas

essayant de raccourcir la version de Grealy

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

remarque: comme la version précédente, cela ne gère pas correctement les nombres octaux, comme 0177.0.0.1

0
rejetto
    <div style="text-align:left">
        <h2>Choose if you want to enter a single ip or range of ip's</h2>
      <select  [(ngModel)]="ipranging">
        <option  selected disabled value="none"> -- select an option -- </option>
        <option  value='ip'>Single Ip address</option>
        <option  value="range">Ip range</option>
      </select>
      </div>

    <form *ngIf="ipranging === 'ip'" novalidate [formGroup]="testForm1" class="render">
      <label>IP Address: 
        <input formControlName="inp" placeholder='0.0.0.0'/></label>
            <input formControlName="inp3" hidden/>
          <!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
          <p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
          <p *ngIf="testForm1.controls.inp.value != '' && testForm1.controls.inp.status == 'INVALID'" >Invalid</p>
    </form>

    <form *ngIf="ipranging === 'range'" novalidate [formGroup]="testForm2" class="render">
      <label>Starting IP:
        <input formControlName="inp" placeholder='0.0.0.0'/></label>
          <label>
              Ending IP:
            <input formControlName="inp2" placeholder='0.0.0.0'/></label>
            <input formControlName="inp3" hidden/>
          <!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
          <p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
          <p *ngIf="testForm2.controls.inp.value != '' && testForm2.controls.inp.status == 'INVALID' || testForm2.controls.inp2.value != '' && testForm2.controls.inp2.status == 'INVALID'" >Invalid</p>
          <p *ngIf="testForm2.controls.inp3.errors.value2GreaterThanValue1 == true">Starting IP is larger than the ending IP</p>
    </form>
0
user11107730

Colin Hebert a souligné la meilleure solution. Mais personne n’a "expliqué" en fournissant le code, alors voici ("Juste parce que je pense que c’est marrant:";)

var aIP = [
  '192.168.0.1',
  '255.255.255.255',
  '1.2.34.647',
  '256.0.0.0',
  '255,0,0,0',
  '123.123.123',
  '1.2.3.4.5'
  ];

aIP.forEach(function(ipAddr) {
  
  var a = ipAddr.split('.'),
      cnt = 4;

  document.write('Testing ' + ipAddr + '<br/>');

  try {
    a.forEach(function(v) {
      if( v<0 || v>255 )
        throw false;
      cnt--;
    });
    if( cnt!=0 )
        throw false;
      cnt--;
    document.write('- Pass!<br/>');
  }
  catch (e) {
    document.write('- Fail!<br/>');
  }
});

0
SamWhan

Vous pouvez également vérifier avec mes expressions données, j'avais vérifié et écrit un programme en Java pour valider l'adresse ipv4. Il renvoie true si l'adresse Ipv4 est correcte ou inversement.

Modèle de chaîne = "^ ([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]) $ "

import Java.util.regex.Matcher;
import Java.util.regex.Pattern;
import Java.util.Scanner;

class Solution{

    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String IP = in.next();
            System.out.println(IP.matches(new MyRegex().pattern));
        }

    }
}

    class MyRegex{
        String pattern="^([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]?\\dCongrats, you solved this challenge!\\d?|2[0-4]\\d|25[0-5])$";

}
0
Mukesh Kumar Gupta

L'OP a demandé la validation d'une adresse IP. Le phrasé du Q implique presque certainement IPv4 (par opposition à IPv6). J'ai déjà commenté le PO sur jusqu'où cette vérification de validité pourrait aller, ainsi qu'applaudir un répondant pour avoir choisi une approche sans ER. Comme je voulais aussi (dans certaines circonstances) tester la validité de l'adresse si je l'utilise sur un serveur public, j'ai créé le JS suivant:

function isSimpleIPv4( ip, u=true ) {
    if ((ip === undefined) || (ip === null) || (ip.length > 15)) return false;
    var p = ip.split(\'.\');
    if (p.length != 4) return false;
    p.forEach( function(v,k){p[k]=Number(v);} );
    if (isNaN(p[0]) || isNaN(p[1]) || isNaN(p[2]) || isNaN(p[3]) ) return false;
    if ((p[0] < 1) || (p[0] > 255) || (p[1] < 0) || (p[1] > 255) || (p[2] < 0) || (p[2] > 255) || (p[3] < 0) || (p[3] > 255)) return false;
    if (!u) return true;
    if ((p[0] > 223)) return 'multicast';
    if ((p[0] == 127)) return 'loopback';
    if ((p[0] == 10)) return 'RFC1918';
    if ((p[0] == 192) && (p[1] == 168)) return 'RFC1918';
    if ((p[0] == 172) && (p[1] >= 16) && (p[1] <= 31)) return 'RFC1918';
    return true;
}

Si on veut vérifier les adresses "utiles", alors seule la chaîne IP est nécessaire, sinon, si on recherche seulement 0-255.0-255.0-255.0-255, appelez la fonction avec la chaîne IP et false. Dans le premier cas, la fonction retournera vrai/faux/quand est la cause "d'échec" de l'utilité. Les adresses RFC1918 prévues par un visiteur du site Web ne seront pas accessibles à partir d'un serveur public et pourraient même compromettre l'un de ses propres serveurs (tout comme les adresses comprises dans la plage de bouclage 127.x.x.x). De même, utiliser une adresse de multidiffusion n'est pas utile non plus. Si vous êtes intéressé par la vérification de l'utilité mais ne vous souciez pas de la cause, vous devrez alors faire if (isSimpleIPv4(ipString) !== true) console.log('Not a valid and useful IP address');

0
Mark Bradley

Essayez ceci aussi:

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

bien que cette question date de 5 ans, je doute que vous cherchiez toujours la réponse.

a posté plus d’informations sur un autre sujet: Validation des adresses IPv4 avec regexp

0
rda

pour le motif ex 192.168.23.28/255.255.255.0

^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$

pour le motif ex 192.168.26.82/24 ou 192.168.23.28/255.255.255.0

^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))$

pour le motif ex 192.168.26.28

^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$

pour le masque de réseau ex 255.255.255.0

^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$
0
Shashank Bhatnagar

ESSAYE ÇA,

ValidIpAddressRegex = "^(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]?)$"
0
NIMISHAN