Découper un String en java

[Résolu/Fermé]
Signaler
-
 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

4 réponses

Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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

Niels
> Niels
Il n'affiche pas le mot de passe. Je n'arrive pas à trouver l'erreur. Pourrais-tu m'aider ?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852 > 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);
>
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013

Merci, c'est très gentil à toi de m'avoir aidé. Le code fonctionne désormais :)
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...
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
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é.

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"
Merci beaucoup pour cette decouverte de la fonction split( )
Le post est vieux mais il est toujours ... "al dente" !