Aller au contenu

[Java]Probleme concernant l'analyse d'une IP


Messages recommandés

Bonsoir,

j'ai écrit le code suivant pour vérifier qu'une IP a été correctement écrite :

public class Verification{
public static void main(String [] args){
String myString [] = "127.0.0.1 2000".split(" ");//contient l'IP et le port
String  s[] = myString[0].split(".");//decompose l'IP obtenue
System.out.println(s.length);//ici j'obtiens 0
int t[] = new int[s.length];
//Verfie que l'IP est correcte
for(int i=0; i<s.length; i++){
	t[i] = Integer.parseInt(s[i]);
	System.out.println(t[i]+"");
	if(t[i]<0 || t[i]>255){
	System.out.println("les nombres doivent etre compris entre 0 et 255");
	System.exit(-1);
	}
}
String ip = myString[0];
int port = Integer.parseInt(myString[1]);
System.out.println(ip);
System.out.println(port+"");
}
}

A l'execution, j'obtiens ceci :

java Verification
0
127.0.0.1
2000

J'obtiens comme nb d'éléments pour le tableau s 0 alors qu'il devrait y avoir 4 éléments.

Le probleme se situe au niveau de la recherche des . car lorsque je remplace les . par des : , le découpage est fait.

Comment faire pour indiquer qu'il faut chercher le caractere "." ?

Et également comment faire pour que tous les espaces soient efface et pas qu'un seul.

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

String s[] = myString[0].split(".");//decompose l'IP obtenue

a changé en

String s[] = myString[0].split("\\.");//decompose l'IP obtenue

Je ne comprends pas ce que tu veux dire par "effacer tous les espaces", de quels espaces parles tu ? :fumer:

PS: Explication :

split se base sur une expression regex, "." est un caractère spécial, et doit donc être échappé avec "\", mais "\" est également un caractère spécial et doit aussi être échappé, d'où "\\."

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,
String s[] = myString[0].split(".");//decompose l'IP obtenue

a changé en

String s[] = myString[0].split("\\.");//decompose l'IP obtenue

Je ne comprends pas ce que tu veux dire par "effacer tous les espaces", de quels espaces parles tu ? :fumer:

PS: Explication :

split se base sur une expression regex, "." est un caractère spécial, et doit donc être échappé avec "\", mais "\" est également un caractère spécial et doit aussi être échappé, d'où "\\."

Ok merci.

Par effacer "tous les esapces", je veux dire qu'un String contienne :

"127.0.0.1 2000"

ou

"127.0.0.1																   2000"

Le résultat est le même apres les split.

J'ai vu sur ce lien qu'il fallait faire :

String  s[] = myString[0].split("\\s+");

Je souhaite récupérer ce qui se trouve entre les () pour avoir ceci en sortie dans l'exemple que j'ai pris :

a 10
a 15
b 45
b 67

J'ai écrit ceci :

String st [] = "(a 10)(a 15)(b 45)(b 67)".split("\\((.+)\\)");
for(int i=0; i<st.length; i++){
	System.out.println(st[i]);
}

mais ça ne fonctionne pas.

Lien vers le commentaire
Partager sur d’autres sites

String myString [] = "127.0.0.1 2000".split("[ ]+");//contient l'IP et le port

Me semble moins compliqué ca pour les espaces :fumer:

Ensuite, pour le coup des parenthèses, tu ne peux pas le faire en 1 seul split je pense, split se sert de la chaine regex pour trouver la chaine de séparation, pas pour "extraire" ce que tu veux.

Comme ca par exemple :

	String st [] = "(a 10)(a 15)(b 45)(b 67)".split("[(]");
for(int i=0; i < st.length; i++) {
	st[i] = st[i].split("[)]")[0];
}

Lien vers le commentaire
Partager sur d’autres sites

le plus simple (sic) dans ce cas est de se battre à coups d'expressions régulières...

regex pour validation d'une ip : ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$

un petit exemple :

import java.io.*;
import java.util.regex.*;

public class testRegex {
 private static Pattern pattern;
 private static Matcher matcher;

 public static void main(String args[]) {
//Si tu as besoin d'explication, pour la regexp, je suis là;)
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
matcher = pattern.matcher("127.0.0.1"); //La chaine que tu veux vérifier

while(matcher.find()) {
  System.out.println("IP OK !");
}
 }
}

Pour supprimer les espaces : (à lancer évidemment avant la vérification du code précédent :eeek2:)

/ / compilation de la regex avec le motif : "\s" qui correspond à un caractère "blanc" en autre un espace, tabulations, etc
Pattern p = Pattern.compile("\s");
/ / création du moteur associé à la regex sur la chaîne "127 .  0.   0.1   "
Matcher m = p.matcher("127 .  0.   0.1   ");
/ / remplacement de toutes les occurrences de "\s" par "" (rien)
String s = m.replaceAll("");

// Va te renvoyer 127.0.0.1

Bon voilà, je suis fan des regexp, je trouve que ça donne des solutions super élégantes :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Salut,

le plus simple (sic) dans ce cas est de se battre à coups d'expressions régulières...

regex pour validation d'une ip : ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$

un petit exemple :

import java.io.*;
import java.util.regex.*;

public class testRegex {
 private static Pattern pattern;
 private static Matcher matcher;

 public static void main(String args[]) {
//Si tu as besoin d'explication, pour la regexp, je suis là;)
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
matcher = pattern.matcher("127.0.0.1"); //La chaine que tu veux vérifier

while(matcher.find()) {
  System.out.println("IP OK !");
}
 }
}

Chez toi, le code compilait en le lançant tel quel ?

Chez moi ça me donnait ces erreurs :

javac testRegex.java
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
											^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
													 ^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
														^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
															^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
																			 ^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
																					  ^
testRegex.java:10: illegal escape character
pattern = Pattern.compile("^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");
																						 ^
7 errors
singh@ubuntu:~/Desktop/test$ javac testRegex.java

Que j'ai corrigé en rajoutant un \

J'aimerai bien avoir une explication sur l'expression réguliere dans la méthode compile.

String myString [] = "127.0.0.1 2000".split("[ ]+");//contient l'IP et le port

Me semble moins compliqué ca pour les espaces :eeek2:

Ensuite, pour le coup des parenthèses, tu ne peux pas le faire en 1 seul split je pense, split se sert de la chaine regex pour trouver la chaine de séparation, pas pour "extraire" ce que tu veux.

Comme ca par exemple :

	String st [] = "(a 10)(a 15)(b 45)(b 67)".split("[(]");
for(int i=0; i < st.length; i++) {
	st[i] = st[i].split("[)]")[0];
}

Dans la 1ere case du tableau, il y a la chaine vide. J'obtiens ceci à l'affichage :

//ici il y a un blanc

a 10

a 15

b 45

b 67

Est-ce qu'il y a une méthode qui fasse cela sans qu'il y a besoin de faire de modification ou bien il faut que je décale tous les éléments du tableau?

Lien vers le commentaire
Partager sur d’autres sites

Non, avec la fonction split de String, il est impossible d'enlever ce blanc. Comme je te l'ai dit, split va chercher les parenthèses ouvrantes comme séparateur, et il y aura toujours forcément "rien" devant la 1ère parenthèse, d'où ce blanc.

La seule vrai solution est donc de fare un regex, comme suggéré.

Pour l'explication :

ton ip est constitué de 4 "groupes".

Le premier étant un nombre, et les 3 autres étant un point (".") et un nombre. Ex 127.0.0.1 nous donnes les groupes "127", ".0", ".0",".1".

A partir de là, "(25[0-5]|2[0-4]\d|[0-1]?\d?\d)" teste le premier groupe. Le truc c'est qu'il teste si le nombre dans la chaine est compris entre 0 et 255, donc il teste si :

- si le nombre commence par 25, il doit forcement avoir pour unité un nombre entre 0 et 5 (256 etant impossible)

- si le nombre commence par 2, les dizaines doivent etre entre 0 et 4

- sinon le nombre peut, ou pas, avoir 0 ou 1 pour les centaines, peut ou pas avoir un nombre entre 0 et 9 pour les dizaines, et doit avoir un chiffre entre 0 et 9 pour les unités.

Le même procédé est répété pour les derniers groupes, sauf qu'il commence par \\., et qu'ils sont au nombre de 3 ( {3} ).

Par contre, comme toi tu veux récupérer les valeurs, il faudrais modifier comme ca :

pattern = Pattern.compile("^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d))(?:\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d))(?:\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d))$");
matcher = pattern.matcher("127.0.0.1"); //La chaine que tu veux vérifier
if(matcher.matches()) {
System.out.println("IP OK!");

for(int i=1;i<=matcher.groupCount(); i++) {
	System.out.println(matcher.group(i));
}
}

(je fais pas avec "{3}" parce qu'il va pas comprendre ce qu'il faut sauvegarder)

Le 1er groupe contient toujours la chaine entière, c'est pour ca que je pars de 1

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...