Java-découpage de String

Fermé
Aethan - 26 mars 2009 à 19:19
 Aethan - 17 avril 2009 à 00:34
Bonjour,

Pour les besoins d'un programme qui va traiter des phrases entrées au clavier par l'utilisateur ("Si tu as le temps, tu peux venir avec moi." par exemple). J'aurai besoin de récupérer chaque mot et aussi les signes de ponctuation ( la virgule "," et le point "." dans la phrase d'exemple) pour pouvoir les traiter ultérieurement.

J'ai regardé la classe StringTokenizer qui semble correspondre à mes besoins, mais on a l'air de pouvoir lui donner qu'un seul type de délimitateur. Comme je lui demande au minimum comme délimitateur l'espace, je récupère comme mot "temps," au lieu de récupérer "temps" puis ",". De même à la fin de la phrase je récupère la String "moi." au lieu de "moi" puis "." .
Faut-il mieux que je crée de toute pièce un objet plus puissant que le StringTokenizer de base admettant plusieurs types différents de délimitateurs, ou alors je repasse sur chaque mot renvoyé avec un StringTokenizer configuré pour séparer les signes de ponctuation des mots? Dans ce dernier cas, ça implique certainement de devoir passer chaque mot à travers un série de StringTokenizer configurés chacun pour un type de ponctutation : un pour le point, l'autre pour la virgule, le point virgule, le point d'interrogation...

En vous remerciant par avance
A voir également:

3 réponses

Utilisateur anonyme
27 mars 2009 à 09:07
Désolé il y a un petit problème:

String unePhrase = "Si tu as le temps, tu peux venir avec moi.";
String unePhrase2 = unePhrase.replaceAll(",", " ,");
System.out.println("la phrase : " + unePhrase);
//unePhrase2 = unePhrase.replaceAll("\\.", " \\."); ligne remplacée par la ligne suivante
unePhrase2 = unePhrase2.replaceAll("\\.", " \\.");
System.out.println("la phrase : " + unePhrase);

StringTokenizer chaine;
chaine = new StringTokenizer(unePhrase2);
while (chaine.hasMoreTokens()) {
String tok = chaine.nextToken(); // stocker par exemple dans un tableau
System.out.println("tok = " + tok);
}
Cordialement,

Dan
1
Je reviens pour faire un petit retour sur mon problème. En fait la solution était déjà contenue dans la classe StringTokenizer, il fallait juste la trouver (ce qui m'a pris un peu de temps, mais j'ys suis arrivé).

Voilà le bout de code qui m'intéressait :

StringTokenizer decoupeur = new StringTokenizer(String s," .?!,:;&()[]'",true);

nbmot = decoupeur.countTokens();

phrase = new String[nbmot][2];

int j = 0;
while(j<nbmot){phrase[j][0] = decoupeur.nextToken(); j++;}


En fait il fallait donner une liste des délimiteurs que je souhaitais à StringTokenizersous la forme d'une String, " .?!,:;&()[]'" dans le cas présenté. En mettant true comme troisième paramètre, StringTokenizer me renvoie à chaque fois qu'il les rencontres les espaces, les . , les ?, les !, etc.
Le gros soucis de compréhension que j'ai eu portais sur cette string, je pensais que StringTokenizer l'interpréterais comme un UNIQUE délimitateur 'un peu tordu, certes), et pas comme la liste des délimitateurs que je désirais (les signes de ponctuation et espace).
0
Personnellement à ta place je stockerais les résultats de ton tokenizer par les espace dans un tableau de String.

Ensuite il te reste juste à comparer le dernier charactere de chaque mot de ton tableau avec un tableau de charactere ou tu aurais mis l'ensemble des ponctuation que tu veux extraire. Quand ca correspond tu le retires du mot et tu le stock à part.
0
Utilisateur anonyme
27 mars 2009 à 02:36
Salut,

Tu peux essayer comme ci-dessous:


String unePhrase = "Si tu as le temps, tu peux venir avec moi.";
String unePhrase2 = unePhrase.replaceAll(",", " ,");
System.out.println("la phrase : " + unePhrase);
unePhrase2 = unePhrase.replaceAll("\\.", " \\.");
System.out.println("la phrase : " + unePhrase);

StringTokenizer chaine;
chaine = new StringTokenizer(unePhrase2);
while (chaine.hasMoreTokens()) {
String tok = chaine.nextToken(); // stocker par exemple dans un tableau
System.out.println("tok = " + tok);
}
Cordialement,

Dan
0
Merci de votre aide, je vais tester les solutions proposées, je vous tiendrai au courant si j'ai réussi à résoudre mon problème.
0