Découper un String en java

Résolu/Fermé
Niels - 14 mars 2008 à 09:12
 le-spliteur - 25 juin 2012 à 07:28
Bonjour,

Je réalise une application web dans laquelle je récupère une URL. Une fois récupérée, je dois travailler dessus pour extirper un mot de passe et un login.

Imaginons l'URL suivante :

http://localhost:8080/mdp=blablabl&&login=bliblibli/

J'arrive, dans un premier temps, à découper l'URL de façon a récupérer "mdp=....&&login=..../". Ensuite, je récupère le mot de passe avec l'expression suivante :

String url="http://localhost:8080/mdp=blablabl&&login=bliblibli/";
String login=url.substring(22,url.lastIndexOf("/"));
System.out.println(login);
String mdp = login.substring(4, login.lastIndexOf("&&"));
System.out.println(mdp);

(l'URL est entré en dur pour l'instant, ce n'est que ma partie "test" du programme)

Je récupère donc "blablabla". Mais pour récupérer "bliblibli" c'est une autre histoire... En effet, la longueur de l'URL jusqu'au mot de passe est toujours la même. Il est donc facile de récupérer le mot de passe. Mais ce dernier peut avoir une taille variable donc je ne sais pas comment récupérer le login.

Quelqu'un aurait-il une idée pour me mettre sur la voie ?

Je vous remercie d'avance,
Niels
A voir également:

4 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
14 mars 2008 à 10:29
Bonjour,

Découper par rapport à un entier (une taille donc), c'est pas terrible. Du moins si tu veux réutiliser ton code par la suite c'est trop spécifique, il faudrait que tu recalcule et ré-ajuste ces entiers pour justement pas que tu ai un indexOutOfBoundException si tu change l'url en entrée.

Ce que je te conseille de faire c'est de découper par rapport à ce que tu sais qu'il y a dans ta chaine de caractère.
Par exemple tu peux en premier lieu supprimer le dernier "/" si ta chaine fini par ce caractère.
Ensuite tu découpe par rapport au dernier "/" pour récupérer ce qui vient après :

String url="http://localhost:8080/mdp=blablabla&&login=bliblibli/"; 
if ( url.endsWith("/") )
   url = url.substring(0,url.length-1);
// --- Take only after last character '/'
url = url.substring(url.lastIndexOf("/"));


Ensuite pour ce qui est de récupérer les paramètres, il te suffit de faire un split de ta chaine de caractère selon la chaine "&&", puis de traiter tes paramètres :
String[] params = url.split("&&");
String[] myCurrParam = null;
String login = "", mdp = "";
for ( int i = 0; i < params.length; i++ ){
    // --- Split by character '=' in order to retrieve parameter name & value 
    myCurrParam = params[i].split("=");
    if ( myCurrParam != null && myCurrParam.length >= 2 ){
        if ( myCurrParam[0].equalsIgnoreCase("login") )
           login = myCurrParam[1];
        else if ( myCurrParam[0].equalsIgnoreCase("mdp") )
           mdp = myCurrParam[1];
    }
    else
       System.err.println("Bad parameter in url : ignored.");
}
System.out.println("Login : "+login);
System.out.println("Mot de passe : "+mdp);


Le code donné ci-dessus a été tapé directement sur le forum, donc n'est ni testé ni validé au niveau de la syntaxe, mai ça devrait à priori fonctionner correctement.

11
Merci bien pour ta réponse, je mets en place le code que tu as laissé et je corrigerais, si besoin est !

Niels
0
Niels > Niels
14 mars 2008 à 12:17
Il n'affiche pas le mot de passe. Je n'arrive pas à trouver l'erreur. Pourrais-tu m'aider ?
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > Niels
14 mars 2008 à 13:04

Le fait est que j'ai oublié d'ajouter 1 à cette ligne :
		url = url.substring(url.lastIndexOf("/"));


Ce qui fait que le dernier '/' est compris dans la chaine, du coup il y a "/mdp=" et non "mdp=".
Il suffit donc d'exclure le '/' lorsqu'on fait le substring :
		url = url.substring(url.lastIndexOf("/")+1);


Le reste du code ne change pas. (si ce n'est qu'il faut mettre () sur la méthode .length de ce code :

url = url.substring(0,url.length()-1);
0
Niels > kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
14 mars 2008 à 13:55
Merci, c'est très gentil à toi de m'avoir aidé. Le code fonctionne désormais :)
0
Je viens d'essayer ceci :

String url="http://localhost:8080/mdp=blablabla&&login=bliblibli/";
String login=url.substring(22,url.lastIndexOf("/"));
System.out.println(login);
String mdp = login.substring(4, login.lastIndexOf("&&"));
System.out.println(mdp);
System.out.println(mdp.length());
int longueur = 4+mdp.length()+8;
String identifiant=login.substring(longueur, login.lastIndexOf("/"));
System.out.println(identifiant);

Mais, j'ai cette erreur qui m'est retournée :

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -22
at java.lang.String.substring(Unknown Source)
at main.main(main.java:28)

Je ne comprends pas pourquoi...
3
c'est bon, j'ai réussi et j'ai compris le message d'erreur.

voici le code que j'ai utilisé :

String url="http://localhost:8080/mdp=blablabla&&login=bliblibli/";
String login=url.substring(22,url.lastIndexOf("/"));
System.out.println(login);
String mdp = login.substring(4, login.lastIndexOf("&&"));
String x=login;
System.out.println(mdp);
System.out.println(mdp.length());
int longueur = 4+mdp.length()+8;
int log=login.length();
String identifiant=x.substring(longueur, log);
System.out.println(identifiant);


Niels
1
On peut faire ça avec une regex, c'est plus concis.

String url="http://localhost:8080/mdp=blablabla&&login=bliblibli/";
Pattern p = Pattern.compile(mdp=\\(.*\\)&&login=\\(.*\\)\/);
Matcher m = p.matcher(url);
if(m.find){
String login = m.group(2);
String mdp=m.group(1);
}

code tapé en direct, non vérifié.
1
brrrrrr pop
24 nov. 2009 à 21:56
le pattern tu peux le simplifier avec un split ().
ca te coupe ton string et plusieurs bouts.


par ex :

String b = blabla&&blibli
String f [] = b.split ("&&") ;
String h = f[0];
String g= f[1] ;

System.out.println ("pass : "+h) ; ----> va sortir dans la console "pass : blabla"
System.out.println ( "login : +g) ; ----> va sortir dans la console "login : blibli"
0
Merci beaucoup pour cette decouverte de la fonction split( )
Le post est vieux mais il est toujours ... "al dente" !
0