Découper un String en java

Résolu
Niels -  
 le-spliteur -
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 4089 Date d'inscription   Statut Contributeur Dernière intervention   857
 
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
Niels
 
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
 
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 4089 Date d'inscription   Statut Contributeur Dernière intervention   857 > Niels
 

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 4089 Date d'inscription   Statut Contributeur Dernière intervention  
 
Merci, c'est très gentil à toi de m'avoir aidé. Le code fonctionne désormais :)
0
Niels
 
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
Niels
 
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
raphix
 
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
 
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
le-spliteur
 
Merci beaucoup pour cette decouverte de la fonction split( )
Le post est vieux mais il est toujours ... "al dente" !
0