Regex negation chaine caractère

Fermé
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015
-
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
-
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...




5 réponses

Messages postés
16472
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2022
2 939
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
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015
31
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 :)
Messages postés
16472
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2022
2 939
Rajoute un [^\d] devant alors :
[^\d]((([02]?[0-9]?[0-9])|(1[0-8][0-9])|(19[013-9]))\.\d+\.\d+\.\d+)
Messages postés
18412
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 janvier 2022
5 535
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
$ 
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 584
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 ?
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015
31
[^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é !
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 584 >
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015

Et en encapsulant l'ensemble dans des parenthèses ?
^([^1][^9][^2]).\d+\.\d+\.\d+
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015
31 >
Messages postés
284
Date d'inscription
mercredi 10 février 2010
Statut
Membre
Dernière intervention
3 mai 2015

La il ne match plus rien du tout :(

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
Messages postés
16472
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2022
2 939
Je ne suis pas sûr qu'il s'agisse de langage Java, sinon il y aurait plus simple que des regex pour ça
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
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...