Regex negation chaine caractère

urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention   -  
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   -
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

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention   30
 
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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Rajoute un [^\d] devant alors :
[^\d]((([02]?[0-9]?[0-9])|(1[0-8][0-9])|(19[013-9]))\.\d+\.\d+\.\d+)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention   30
 
[^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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431 > urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention  
 
Et en encapsulant l'ensemble dans des parenthèses ?
^([^1][^9][^2]).\d+\.\d+\.\d+
0
urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention   30 > urahara78 Messages postés 294 Date d'inscription   Statut Membre Dernière intervention  
 
La il ne match plus rien du tout :(
0
Utilisateur anonyme
 
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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ktm620enduro Messages postés 293 Date d'inscription   Statut Membre Dernière intervention   38
 
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