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

Java Discussion :

Découper une phrase en mot


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Je veux découper une phrase en mot...

    Exemple : Mon chien est beau.

    À mettre dans un tableau.

    Mon
    chien
    est
    beau
    .

    Des suggestions ?

  2. #2
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 563
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    Il nous faudrait la définition de ce qu'est un mot... Je vois que le point est considéré comme un mot, donc on ne peut pas faire simplement un split() sur les espaces.

    A priori Il faut construire une List<String> puis boucler sur les caractères de la String. Tant qu'on tombe sur des lettres, on les ajoute au mot qu'on est en train de lire. Quand on tombe sur autre chose qu'une lettre, on ajoute le mot en cours dans la liste, puis on en recommence un autre.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    J'ai changé le nom de mon sujet.

    Je veux maintenant vérifier si une phrase entrée au clavier est valide.

    Pour être valide, elle doit contenir des espaces, être formée seulement de lettre et se terminer par un point.

    J'avais fais quelque chose comme ceci mais sans succès. C'est pour valider si chaque charactère est une letre....

    Et sinon dans l'ensemble, est-ce correct de mettre un Tokenizer dans do while ?

    Merci

    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
    31
    32
    33
    34
    35
    36
    static String validerPhrase()
    	{
     
    		String phrase = null;
     
     
    		int nbMots;
    		boolean valide = true;
     
    		do
    		{
     
     
    			System.out.println("Entrer une phrase");
    			phrase = LireString();
     
    			StringTokenizer str = new StringTokenizer(phrase);
     
    			nbMots = str.countTokens();
     
    			if(!phrase.endsWith("."))
    				valide = false;
    			if (nbMots < 2)
    				valide = false;
     
    				for(int i = 0; i < phrase.length() - 1; i++)
    				{
    					if(Character.isLetter(phrase.charAt(i)) == false);
    							valide = false;
    				}
     
    		}
    		while(valide == false);
     
    		return phrase;
    	}

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 601
    Points : 15 633
    Points
    15 633
    Par défaut
    Vu ton énoncé, tu n'as même plus besoin de découper ta phrases en mots.

    Ton problème se résout très facilement avec une expression régulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    phrase.matches("(?=.* )[A-Za-z ]+\\.");
    Je te conseille de te renseigner sur les expressions régulières:
    (?=.* ) sert à vérifier qu'il y a au moins un espace.
    [A-Za-z ]+ sert à s'assurer que la phrase est uniquement constituée de lettres et d'espace.
    \\. sert à s'assurer que la phrase ce termine par point

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Merci, je ne connaissais pas ça !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 50
    Points
    50
    Par défaut
    Sinon tu peux aussi utiliser un StringTokenizer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringTokenizer st=new StringTokenizer("ta chaîne");
    Qui par défaut s'arrête dès la rencontre de " \t\r\n\f". Si t'as un autre déllimiteur, tu pourras toujours le signaler. Pour un slash tu mettras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringTokenizer st=new StringTokenizer("ta chaîne","/");
    Good Luck

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 601
    Points : 15 633
    Points
    15 633
    Par défaut
    Sauf que pour le coup le string StringTokenizer ne répond plus du tout au nouvel énoncé de son problème. Son but est seulement de découper une chaine.
    D'ailleurs utiliser la méthode split() de la classe String est préférable au StringTokenizer.

  9. #9
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Une petite erreur...
    Désolé UTHER, mais votre expression régulière n'est pas tout à fait correcte.
    Pour préciser que la chaîne se termine par un '.', il faut écrire :

    phrase.matches("(?=.* )[A-Za-z ]+\\.$");

  10. #10
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 601
    Points : 15 633
    Points
    15 633
    Par défaut
    Si, elle est correcte : car je utilise l'expression régulière avec matches() qui essaie d'applique le pattern a l'ensemble de la chaine.

    Donc le "$" n'est pas nécessaire.

  11. #11
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Désolé d'insister...
    Je ne voudrai pas contredire pour le plaisir, mais sans le caractère $, si vous ajoutez des caractères derrière le '.', votre méthode matches renverra vrai alors que dans les objectifs du demandeur il était bien spécifié "... se termine par un '.' "
    Donc, sans le $ on ne répond pas à cette exigence. Mais si on fait abstraction du fait que le '.' est ou n'est pas le dernier caractère de la phrase, c'est juste.

    Voilà, c'est tout.

    Allez, à bon entendeur, salut.

  12. #12
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 601
    Points : 15 633
    Points
    15 633
    Par défaut
    Si tu ne me crois pas essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String texte = "Texte non termine par point. truc";
    String pattern = "(?=.* )[A-Za-z ]+\\.";
    System.out.println(texte.matches(pattern));
    matches() vérifie que l'intégralité de la chaine correspond au pattern. Contrairement a un find() qui recherche un fragment de la chaine correspondant au pattern.

  13. #13
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Ok !
    Ok, Uther. Merci d'avoir éclairé ma bougie, j'avais compris un truc de travers concernant l'utilisation des expressions régulières.

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Uther Voir le message
    Si tu ne me crois pas essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String texte = "Texte non termine par point. truc";
    String pattern = "(?=.* )[A-Za-z ]+\\.";
    System.out.println(texte.matches(pattern));
    matches() vérifie que l'intégralité de la chaine correspond au pattern. Contrairement a un find() qui recherche un fragment de la chaine correspondant au pattern.
    Pour revenir la-dessus, est-ce qu'il est possible de modifier le regex pour qu'il accepte les phrase se terminant par un point d'exclamation ? et un point d'interrogation !

    Mon chien !
    Mon chien ?

    Accepté

    Merci

  15. #15
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Personne a une idée pour rajouté le ! et ? à la fin d'une phrase

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Ben tu remplaces par .
    Les \\ sont là pour considérer . et ? comme de simples caractères alors qu'ils ont une signification bien particulière en tant qu'expression régulière.
    Je crois pas que ! en est une.

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Je vous remercie.

    J'ai tellement de problème avec les regex....

    J'essayais ceci

    \\.\\?\\!

    héhé

  18. #18
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String texte = "Bienvenue à bord.";
    String pattern = "(?=.* )[A-Za-z ]+\\.";
    System.out.println(texte.matches(pattern));
    texte = "Bienvenue dans l'enfer des expressions régulières!" ;
    //.....etc; etc.

Discussions similaires

  1. [Débutant] Couper une phrase en mots SANS Str. ...
    Par Graimbault dans le forum Caml
    Réponses: 11
    Dernier message: 05/03/2014, 18h10
  2. Découper les mots dans une phrase
    Par selmastar dans le forum Débuter
    Réponses: 2
    Dernier message: 28/03/2013, 07h58
  3. Découper une phrase
    Par hidewak dans le forum Langage
    Réponses: 5
    Dernier message: 19/07/2011, 16h31
  4. [Tableaux] Comment decouper une phrase en mots?
    Par Alain15 dans le forum Langage
    Réponses: 3
    Dernier message: 26/06/2006, 10h04
  5. [Tableaux] Découper une phrase en mots
    Par cmoiscrat dans le forum Langage
    Réponses: 5
    Dernier message: 14/02/2006, 13h29

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