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

Collection et Stream Java Discussion :

[Regex][Avis] Méthode de suppression d'une liste de mots


Sujet :

Collection et Stream Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut [Regex][Avis] Méthode de suppression d'une liste de mots
    Salut
    J'ai réalisé une fonction en java qui a comme entrée une chaine de caractères et comme srtie une chaine nettoyée c-à-d où j'ai supprimé tous les mots d'un fichier.
    voilà le code donnez-moi svp votre opinion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static String supprimeMot(String source){		
     
    String chaineSansMot;
     
    chaineSansMot = source.replaceAll(" M1 ", "");
    chaineSansMot = source.replaceAll(" M2 ", "");
    ...
    chaineSansMot = source.replaceAll(" Mn ", "");
     
    return chaineSansMot;  
    }
    [ Modéré par Viena ]
    Ajout d'un tag et modification du titre : Pour la compréhension de tous, utilisez un titre clair et les tags ! merci.

    Les Règles du Forum

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Ta methode ne supprime que le dernier mot. Essaye plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static String supprimeMot(String source)
    {        
         String chaineSansMot = source.replaceAll(" M1 ", "");
         chaineSansMot = chaineSansMot .replaceAll(" M2 ", "");
         ...
         chaineSansMot = chaineSansMot .replaceAll(" Mn ", "");
     
         return chaineSansMot; 
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Une petite réduction de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String[] maListe={M1,----Mn};
    String chaine=source;
    for(int i=0;i<maListe.length;i++)
    {
         chaine= chaine .replaceAll((String)maListe[i], "");
    }     
         return chaine;
    Pour moi cette méthode est très risquée.
    Fais un test avec comme mot M1="a"

    A mon sens il faut que tu utilises des expressions régulieres

    @++ Xav
    galerie virtuelle

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par MrX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine= chaine .replaceAll((String)maListe[i], "");
    cast inutile et couteux en ressources.

    Citation Envoyé par MrX
    Pour moi cette méthode est très risquée.
    c'est à dire ?

    Citation Envoyé par MrX
    A mon sens il faut que tu utilises des expressions régulieres
    C'est le propre de la methode replaceAll(String regex, String replacement)
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    par exemple : M1= cou M2=chat M3=couple

    texte= Un couple se promenait dans le jardin et d'un coup un chat sauta sur le cou de l'homme.


    Alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texte=texte.replaceAll(M1, "");
    texte= Un ple se promenait dans le jardin et d'un p un chat sauta sur le de l'homme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texte=texte.replaceAll(M2, "");
    texte= Un ple se promenait dans le jardin et d'un p un sauta sur le de l'homme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texte=texte.replaceAll(M3, "");

    Résultat final:

    texte= Un ple se promenait dans le jardin et d'un p un sauta sur le de l'homme.


    Résultat attendu:


    Un se promenait dans le jardin et d'un coup un sauta sur le de l'homme.

    Si nous prenons M1="a" c'est encore pire


    Résultat final:

    texte= Un se promenit dns le jrdin et d'un coup un cht saut sur le cou de l'homme.

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Effectivement, c'est très bien vu
    Je pense que la meilleur solution est de trier la liste des mots en fonction de leur taille et de commencer le traitement par le plus long en allant vers le plus court.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Ta méthode est judicieuse mais elle ne marchera pas aussi

    par exemple: M1= couple M2=chat M3=cou


    Résultat final:

    texte= Un se promenait dans le jardin et d'un p un sauta sur le de l'homme.

    Résultat attendu:

    texte= Un se promenait dans le jardin et d'un coup un sauta sur le de l'homme.

    Il faut passser par des expressions régulieres car la méthode replaceAll remplace des chaines de caractères et non des "mots"

    Je pense qu'il va bien s'amuser

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Re bien vu,
    décidemment je fatigue
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Sauf si tu utilises la méthode énoncée, mais en faisant attention de conserver les characteres de séparation avant et après le mot recherché, genre en faisant non pas une recherche sur "cou" mais sur " cou ".

    Il reste un probleme avec cette méthode, par exemple pour le mot homme, dans ta phrase... tu te retrouves avec l'homme, et il te faut donc gérer les charactères de ponctuation, les apostrophes, etc... Mais ca peut aussi se faire comme ca...

    Maintenant, pour etre sur que ca marche, je ferais une decoupe de la phrase selon les différents mots, comme l'a proposé le Yam's et je ferai une recherche exacte de concordance entre les différents mots de la liste... Les characteres de ponctuation sont toujours chiants, à ce niveau là...

  10. #10
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Ceci ne marchera pas non plus
    Aujourd'hui je vous en veux

    par exemple: M1= couple M2=chat M3=homme

    Résultat final:

    texte= Un se promenait dans le jardin et d'un coup un sauta sur le de l'homme.

    Résultat attendu:


    texte= Un se promenait dans le jardin et d'un coup un sauta sur le de .

    avec cette méthode il y aura aussi des probleme avec les sauts de lignes

  11. #11
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    desolé ghorgor j'ai pas lu ton post jusqu'à la fin et je vois que tu avais anticipé ce probleme de virgule, de saut de ligne,...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Si, j'ai dit qu'il fallait faire gaffe aux characteres de ponctuation...

    Et fais gaffe a ton résultat, tu as du oublié cou, au passage, a la fin...

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    télescopage de posts... J'ai pas été assez rapide, j'étais sur un autre...

  14. #14
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Desol j'ai eu le clavier trop rapide.

    Résultat final:

    texte= Un se promenait dans le jardin et d'un coup un sauta sur le cou de l'homme.

    Résultat attendu:

    texte= Un se promenait dans le jardin et d'un coup un sauta sur le cou de .

  15. #15
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    pas grave mais merci de m'avoir dit l'erreur dans l'exemple. J'ai pu la modifier

    @+++

  16. #16
    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,


    Plutôt que d'utiliser un replaceAll par mots (ce qui peut être lourd si la chaine est très grande et qu'il y a beaucoups de mots à supprimer), je pense qu'il est preférable d'utiliser un Matcher avec la regexp ""\\s*(\\p{L}')?(\\p{L}+)\\s*" avec :
    • \\s Les espaces/tabulations, etc...
      \\p{L} n'importe quelle lettre Unicodes (caractères accentuées compris)


    Donc ce pattern permet de rechercher les mots qui peuvent être compris entre des 'espaces'(\\s*) et qui peuvent commencer par un lettre avec apotrosphe ((\\p{L}')?).

    La classe Matcher permet de parcourir les différents mots 'à la main' et permet donc plus de liberté (comparaison avec equalsIgnoreCase() etc...).

    Ce qui pourrait donner :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public static String removeWordsWithMatcher (String str, String[] words) {
    	Pattern p = Pattern.compile("\\s*(\\p{L}')?(\\p{L}+)\\s*");
    	Matcher m = p.matcher(str);
    	StringBuffer result = new StringBuffer();
     
    	// On recherche le mot suivant
    	while (m.find()) {
    		// On récupère le mot courant (m.group(2) == le second terme entre parenthèse,
    		// c-a-d le mot sans les espaces ni apostrophe)
    		String compare = m.group(2);
    		boolean matche = false;
    		// On compare le mot avec la liste des mots à supprimer
    		for (int i = 0; i < words.length && !matche; i++) {
    			if (compare.equalsIgnoreCase(words[i])) {
    				matche = true;
    			}
    		}
     
    		// Si le mot appartient à la liste des termes à supprimer
    		if (matche) {
    			// On le supprime
    			m.appendReplacement(result,"");
    		} else {
    			// Sinon on le laisse tels quel (m.group() == l'ensemble du terme)
    			m.appendReplacement(result, m.group());
    		}
    	}
    	m.appendTail(result);
    	return result.toString();
    }
    A noter toutefois qu'il faudrait encore modifier la regexp en "\\s*(\\p{L}')?([\\p{L}'-]+)\\s*"pour authoriser des mots composé comme "porte-manteau" ou "aujourd'hui"...

    a++

  17. #17
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    merci beaucour pour votre aide

    mais le problème que je veux résoudre c'est la suppression des mots dans le sens français c-à-d en respectant la ponctuation.

    Exemple: bonjour tout le monde, vous allez bien?

    mots à supprimer: M1=tout M2=monde M3=bien

    résultat: bonjour le vous allez

    je pense qu'il faut d'abord supprimer la ponctuation et les mots après

  18. #18
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    tu veux aussi supprimer la ponctuation???

    Si c oui tu les mets dans tes mots à supprimer

    M1="?" ...

  19. #19
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    j'ai utilisé la proposition de MrX pour supprimer la ponctuation mais ça ne marche pas!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String[] maListe={M1,----Mn}; 
    String chaine=source; 
    for(int i=0;i<maListe.length;i++) 
    { 
         chaine= chaine .replaceAll((String)maListe[i], ""); 
    }      
         return chaine;
    dès que je donne à M1="?" , à l'execution le programme me donne le message suivant:
    Exception in thread "main" java.util.regex.PatternSyntaxExceptionangling meta character '?' near index 0

  20. #20
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    salut, j'ai oublié de te dire que certain signe de ponctuation ont un sens

    Donc pense à les despecialiser par exemple pour le ? => \? etc...

Discussions similaires

  1. suppression d'une liste de mots
    Par kaninama dans le forum Langage
    Réponses: 17
    Dernier message: 27/02/2007, 09h03
  2. Réponses: 8
    Dernier message: 30/09/2006, 05h18
  3. 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
  4. 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
  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