IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

suppression d'une liste de mots


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut suppression d'une liste de mots
    Bonjour tout le monde

    J’ai un petit problème avec mon la méthode replaceAll

    Alors je vous pose mon Pb : j’ai une texte en entré et un texte nettoyée on sortie, c'est-à-dire je supprime tt les mots indésirable dans mon texte mais le problème que j’ai que replaceall me supprime encore d’autre caractère par exemple j’ai la chaine :

    "je fais un essai est un test "

    Les mots que je veux supprimer sont {"je", "et" ,"est"} mais a la sortie j’ai cette chaîne :

    " Fais un t "

    Vous ne connaissez pas une autre méthode qui supprime les mots désirer j’ai essayer on ajoutant la méthode trim() mais c’est le même résulta

    ie: Je ne veux pas utiliser le StringTokenizer

    Merci pour votre aide

  2. #2
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Pas normal tout ca tu devrais avoir :


    "fais un essai un t"

    Normallement la methode replace marche très bien.
    MOntre nous ton code, il y a surement une tite "boulette" dedans.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tu devrais modifier ton expression régulière, et ne pas chercher simplement "je", mais plutot " je " (c'est sans doute un peu plus compliqué en réalité, puisqu'il faut tenir compte des virgules des points, etc ...).

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Comme le dit Sanguko, il faut remplacer la ponctuation dans une variable de travail par un blanc, puis faire un split de ta chaine sur blanc et tester (en faisant un trim()) par rapport à ta liste de mots (perso, je préfère StringTokenizer). C'est lourd, mais je ne vois pas comment tu pourrais traiter ça autrement...
    (je présume que tu veux garder 'test' quand tu as 'est' dans ta liste d'exclusion)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    String.replaceAll prenant une expression régulière, il est possible de faire le remplacement en un seul appel, pour un mot donné (sans doute même plusieurs).
    Je te conseille de lire la javadoc de java.util.regex.Pattern, et de recuperer quelques exemples.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    non non j’ai juste oublier le essai je sais que le remplceall marche très bien

    Oui c’est exactement ce que je veux

    J’ai trouver une autre solution mais je ne sais pas si sa m’arrange ou non qlq 1connais cette méthode me confirme SVP c’est l’utilisation des expression régulière mais je ne sais pas trop si c'est vraiment solution

    Merci vraiment pour vos réponses

    Ie : dans mon code la variable qui contient la source à la sortie doit rester la même

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    maxf1 non non j’ai juste oublier le essai je sais que le remplceall marche très bien

    Oui c’est exactement ce que je veux OButterlin

    J’ai trouver une autre solution mais je ne sais pas si sa m’arrange ou non qlq 1connais cette méthode me confirme SVP c’est l’utilisation des expression régulière mais je ne sais pas trop si c'est vraiment solution

    Merci vraiment pour vos réponses

    merci j'ai pas vu ton poste je vais essayer alors et je vous rend la réponse

    Ie : dans mon code la variable qui contient la source à la sortie doit rester la même

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je ne pense pas que tu puisses utiliser une expression régulière pour ce traitement.
    Le problème vient du fait que tu cherches des mots, pas des suites de caractères.
    Exemple :
    "le test n'est pas concluant" te renverrait 2 occurences de "est" là où il n'y a qu'un mot "est" (et encore, tu vois bien qu'il faut traiter la chaine au préalable pour remplacer les ';,:. etc par un blanc)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par OButterlin
    Je ne pense pas que tu puisses utiliser une expression régulière pour ce traitement.
    Le problème vient du fait que tu cherches des mots, pas des suites de caractères.
    Exemple :
    "le test n'est pas concluant" te renverrait 2 occurences de "est" là où il n'y a qu'un mot "est" (et encore, tu vois bien qu'il faut traiter la chaine au préalable pour remplacer les ';,:. etc par un blanc)
    L'expression reguliere permet de chercher des mots, a partir du moment ou tu sais specifier les delimiteurs (comme les espaces et les caracteres de ponctuation).
    En plus, les caractères de ponctuation sont une classe predefinie (cf la doc de Pattern :
    \p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)
    Pour le remplacement, il faut bien sur ne supprimer que la sous-chaine qui correspond au mot (cf http://java.developpez.com/faq/java/...regexp_replace)

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Oui, pourquoi pas.
    Il faudrait donc :
    1- remplacer tous les caractères de ponctuation par un blanc
    2- rajouter un blanc au début et à la fin (cause point 3)
    3- rechercher des mots (encadrés par des blancs)

    Tu y arriverais en 1 fois ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par OButterlin
    Oui, pourquoi pas.
    Il faudrait donc :
    1- remplacer tous les caractères de ponctuation par un blanc
    2- rajouter un blanc au début et à la fin (cause point 3)
    3- rechercher des mots (encadrés par des blancs)

    Tu y arriverais en 1 fois ?
    Oui je suis d’accord pour ta solution la mais tu sais le problème reste le même c’est quant le mots a supprimer et on début de chaîne et que il n’est pas précédé par un vide la il ne sera pas supprimer

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Et hop !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     ...
    		String str = "est ce un test? Oui, ceci est bien un test. Il est";
     
    		String res = str.replaceAll("(\\p{Punct}|\\s+|^)(est)(\\p{Punct}|\\s+|$)", "$1$3");
     
    		System.out.println("str = "+str);
    		System.out.println("==> "+res);
    ...

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Bravo, impressionnant

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Sanguko
    Et hop !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     ...
    		String str = "est ce un test? Oui, ceci est bien un test. Il est";
     
    		String res = str.replaceAll("(\\p{Punct}|\\s+|^)(est)(\\p{Punct}|\\s+|$)", "$1$3");
     
    		System.out.println("str = "+str);
    		System.out.println("==> "+res);
    ...
    et voila mille mercis Sanguko

  15. #15
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faudrait peut-être prendre le problème dans l'autre sens : parcourir tous les mots de la chaine (la regexp est simple, une lettre ou plus : "p{L}+"), et vérifier pour chacun s'ils doivent être supprimé ou pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	public static String replaceWords(String str, Set<String> words) {
    		Pattern p = Pattern.compile("\\p{L}+");
    		Matcher m = p.matcher(str);
     
    		StringBuffer buffer = new StringBuffer(str.length());
     
    		while (m.find()) {
    			String word = m.group();
     
    			if (words.contains(word)) {
    				word = "";
    			}
    			m.appendReplacement(buffer, word);
    		}
    		m.appendTail(buffer);
     
    		return buffer.toString();
    	}

    Et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		String str = "est ce un test? Oui, ceci est bien un test. Il est";
     
    		Set<String> words = new HashSet<String>();
    		words.add("je");
    		words.add("et");
    		words.add("est");
     
    		String res = replaceWords(str, words);
    		System.out.println(res);
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ce un test? Oui, ceci  bien un test. Il
    a++

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par Sanguko
    Et hop !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     ...
    		String str = "est ce un test? Oui, ceci est bien un test. Il est";
     
    		String res = str.replaceAll("(\\p{Punct}|\\s+|^)(est)(\\p{Punct}|\\s+|$)", "$1$3");
     
    		System.out.println("str = "+str);
    		System.out.println("==> "+res);
    ...
    Le meme, en plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     ...
    		String str = "est ce un test? Oui, ceci est bien un test. Il est";
     
    		String res = str.replaceAll("(\\b)(est)(\\b)", "$1$3");
     
    		System.out.println("str = "+str);
    		System.out.println("==> "+res);
    ...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Oui c’est une bonne idée adiGuba merci

    Merci Sanguko tu peux juste me dire ou on peut trouver de la doc pour ce type de problèmes

    Merci beaucoup pour votre aide

    Bonne journée

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    J'ai utilisé la doc de java.util.regex.Pattern. Mais bon, il faut comprendre l'anglais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger une liste de mots
    Par barth69 dans le forum C++Builder
    Réponses: 13
    Dernier message: 08/04/2006, 20h56
  2. Ajout/Suppression d'une liste a l'autre
    Par PeZ dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/03/2006, 14h39
  3. a jour ou suppression a une liste deroulante
    Par kouame berenger aymar dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/12/2005, 08h06
  4. [Regex][Avis] Méthode de suppression d'une liste de mots
    Par manal dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 15/10/2005, 00h39
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo