Regex negation chaine caractère

Bonjour,

En ayant marre de me tirer les cheveux dans tous les sens pour savoir comment faire je viens poser ma question ici.
Je souhaite "tout simplement" récupérer des adresses IP ne commençant PAS par 192.
Hors en regex le symbole ^ utilisé dans [^192] ne convient pas car il recherche les nombres un à un et non la chaine de caractère complète.
J'ai vu sur cette page https://stackoverflow.com/questions/977251/regular-expressions-and-negating-a-whole-character-group qu'ils ont trouvé apparemment un moyen d'y arriver mais je n'arrive pas à l'appliquer à mon exemple.

192\.\d+\.\d+\.\d+ match les ip commençant par 192
(?!192)\.\d+\.\d+\.\d+ devrait matcher celles ne commençant pas par 192, mais ça ne fonctionne pas.

Une idée? Car je commence à perdre espoir...



--
La 21 turbo c'est pas le genre de voiture pour aller faire les courses au supermarché mais plutôt pour faire la course jusqu'au supermarché !

5 réponses

  1. Modérateur
    Testé en Java et sur ton site :
    (([02]?[0-9]?[0-9])|(1[0-8][0-9])|(19[013-9]))\.\d+\.\d+\.\d+

    Remarque: \d+ c'est un peu violent alors que seuls les nombres 0 à 255 sont autorisés.
    La confiance n'exclut pas le contrôle
    1
    1. Sur la chaine 192.3.3.4 il ne match pas le 1 seulement. Hors il ne devrait rien matcher du tout. Je cherche à ce que le regex ne match que les IP ne commençant pas par 192 :)
      0
    2. Modérateur
      Rajoute un [^\d] devant alors :
      [^\d]((([02]?[0-9]?[0-9])|(1[0-8][0-9])|(19[013-9]))\.\d+\.\d+\.\d+)
      0
  2. Contributeur
    hello
    $ cat a1
    192.1.1.1
    193.1.1.1
    200.1.1.1
    333.192.1.1
    192.2.3.4
    $ 
    $ grep -P  '(?<!192)\.\d+\.\d+\.\d+$'  a1
    193.1.1.1
    200.1.1.1
    333.192.1.1
    $ 
    
    1
    1. Contributeur
      Salut,

      Hors en regex le symbole ^ utilisé dans [^192] ne convient pas car il recherche les nombres un à un et non la chaine de caractère complète.

      Et '[^1][^9][^2]' ne le ferait pas ?
      0
      1. [^1][^9][^2]\.\d+\.\d+\.\d+ sur les ip suivantes donne ça : ( ça match en gras)
        192.1.1.1
        200.4.4.4
        900.5.5.5
        290.4.4.4
        333.2.1.9
        291.3.3.3
        210.3.3.3

        EDIT :

        J'utilise ce site pour tester mes regex : https://regexr.com/

        La 21 turbo c'est pas le genre de voiture pour aller faire les courses au supermarché mais plutôt pour faire la course jusqu'au supermarché !
        0
      2. Contributeur
        @urahara78Et en encapsulant l'ensemble dans des parenthèses ?
        ^([^1][^9][^2]).\d+\.\d+\.\d+
        0
      3. @urahara78La il ne match plus rien du tout :(
        0
    2. Salut,

      "Je souhaite "tout simplement" récupérer des adresses IP ne commençant PAS par 192."

      Si on suppose que la syntaxe est correcte,
      exemple avec Regex:
      Pour tester, les IP sont dans un tableau.
      String[] tabIp = {"192.1.1.1", "219.4.4.4", "220.5.5.5", "210.4.4.4", "125.2.1.9",
                     "192.2.2.2", "211.3.3.3", "255.3.3.3"};
      
      Pattern pat = Pattern.compile("192\\.."); // le motif est "192."
      
      for(int i = 0; i < tabIp.length; i++)
               {
                  Matcher m = pat.matcher(tabIp[i]);
                  if(m.find())
                  {
                     System.out.println("On ne prend pas " + tabIp[i]);
                  }
                  else
                     System.out.println("On prend " + tabIp[i]);
               }
      


      exemple sans passer par Regex:

      System.out.println("Avec startsWith(\"192.\")");
      for(int i = 0; i < tabIp.length; i++)
      {
      if (tabIp[i].startsWith("192."))
      System.out.println("On ne prend pas " + tabIp[i]);
      else
      System.out.println("On prend " + tabIp[i]);
      }
      Cordialement,

      Dan
      0
      1. Modérateur
        Je ne suis pas sûr qu'il s'agisse de langage Java, sinon il y aurait plus simple que des regex pour ça
        0
    3. Salut, je ne vois pas le problème, tu preg_match tes ip avec ton expression régulière et tu teste si la première capture est un 192...
      0