33 votes

Comment vérifier si un mot est présent dans une phrase en utilisant Java ?

Je suis nouveau dans la programmation et je travaille sur une fonction qui renvoie vrai si un mot est présent dans une phrase. J'ai essayé le indexOf() mais j'ai également rencontré un certain problème avec cette approche :

Supposons que ma phrase soit I am a, Java Programmer.

Si nous cherchons le mot ram avec le indexOf() alors il retournera true parce que ram est présent dans Programmer alors que la sortie correcte devrait être false como ram n'est pas présent en tant que mot mais en tant que motif.

Comment puis-je contourner ce problème ? Le code que j'utilise pour l'instant est le suivant :

boolean isPresent(String word, String sentence)
{
    if(sentence.indexOf(word) >= 0)
        return true;
    else
        return false;
}

NOTE : Le mot ram C'est juste un exemple pour montrer l'un des problèmes de mon approche actuelle. ram seulement tout le temps. Le mot peut être n'importe lequel comme dire a qui est suivi d'une virgule dans la phrase ci-dessus.

UPDATE : Merci à tous ceux qui ont apporté leurs commentaires et leurs solutions. J'en ai sélectionné une comme réponse acceptée (j'en aurais sélectionné plus si j'en avais eu la possibilité :-)), mais beaucoup m'ont été utiles.

2 votes

Vous pourriez utiliser la méthode string.split et vérifier ensuite si le tableau résultant contient votre mot.

3 votes

Au fait, vous pouvez simplifier la définition de cette fonction de la manière suivante : return sentence.indexOf(word) >= 0; - sentence.indexOf(word) >= 0 est soit true ou false Donc, selon la situation, cela signifie soit return true; ou return false; .

0 votes

La question est claire et complète, mais je peux trouver la réponse à cette question de multiples fois à travers Stackoverflow et et de nombreux autres endroits.

39voto

Evgeniy Dorofeev Points 52031

Essayez le regex

boolean contains = s.matches(".*\\bram\\b.*");

\b signifie limite du mot

4 votes

+1 pour l'utilisation de la limite de mots (et vous pouvez jeter le .* )

2 votes

IIRC, l'intégralité de s doit correspondre à l'expression régulière donnée en Java, de sorte que l'élément .* doit être conservé.

0 votes

Ne serait-il pas plus techniquement correct d'utiliser un tokenizer d'espacement pour résoudre ce problème ?

21voto

Zaheer Ahmed Points 12945

Puisque vous voulez rechercher un mot, il y a trois cas :

  1. le mot en début de phrase signifie qu'il n'y a pas d'espace au début mais un espace à la fin.
  2. mot entre l'espace de la phrase aux deux extrémités.
  3. mot à la fin seulement espace à la fin.

Pour couvrir les trois cas, une solution possible est la suivante :

String str = "I am a JAVA programmer";
String[] splited = str.split("\\b+"); //split on word boundries
Arrays.asList(splited).contains("ram"); //search array for word

Voici une démo qui fonctionne

0 votes

Et si l'OP veut rechercher le mot sans tenir compte de la casse ?

0 votes

Si le PO le souhaite, je lui proposerai stackoverflow.com/a/15269846/821057

0 votes

Et la virgule dans l'exemple de l'OP (s'ils cherchaient a ) ?

10voto

Question :

Comment définir un mot ?

Réponse possible :

Un groupe de caractères séparés par d'autres caractères. Cette deuxième série de caractères est définie par ce que vous choisissez. Supposons que vous choisissiez les caractères suivants . ,?; . Donc, si vous divisez la chaîne d'entrée avec ces caractères (appelés délimiteurs ), vous obtiendrez un ensemble de chaînes de caractères qui sont mots . Maintenant, pour savoir si l'entrée contient le mot ou non, bouclez sur ces chaînes de caractères pour vérifier si elles correspondent à votre requête.

Code :

boolean isPresent(String query, String s) {    
    String [] deli = s.split("[.\\s,?;]+");

    for(int i=0;i<deli.length;i++)
        if(query.equals(deli[i]))
            return true;

    return false;    
}

tl;dr :

Si vous voulez qu'un mot soit défini comme tout ce qui est composé d'alphabets, de chiffres et de traits de soulignement, une regex est prête pour vous : \W+ .

String [] deli = s.split("\\W+");

Pensez à lire cet article si vous voulez en savoir plus sur Java Regex.

3 votes

Bonne réponse, mais notez que split accepte les expressions rationnelles. Vous pouvez donc diviser sur les espaces blancs, ou sur les caractères non alpha, ou sur n'importe quoi d'autre. Vous pouvez également faire equalsIgnoreCase pour correspondre aux mots en majuscules.

0 votes

Comme l'a mentionné @TimB, String.split prend une chaîne regex. Cela signifie deux choses. Tout d'abord, vous ne pouvez pas lui fournir une liste de caractères comme ça (il essaiera d'utiliser l'attribut chaîne entière comme un modèle regex correspondant à un frontière unique ), mais vous pouvez utiliser une classe de caractères regex ( "[. ,?;]" ). Deuxièmement, tous les métacaractères des regex doivent être échappés - votre utilisation de l'option . correspondrait à tout caractère unique, et ? rendrait le , facultatif.

0 votes

Bien que cette réponse soit bonne dans la mesure où elle aide le lecteur à réfléchir à ce qui doit se passer, il est important de noter que \\b est un métacaractère disponible pour indiquer limites des mots ce qui est exactement le genre de chose que le PO recherche. Veillez à faire la différence entre \\b (limite du mot) et \b (backspace), cependant !

2voto

user3580294 Points 5412

Jetez un coup d'œil à la String.matches() méthode. Si vous construisez correctement l'expression régulière, elle devrait être capable de faire ce que vous voulez. Les tutoriels Java constituent un bon point de départ pour les expressions régulières : http://docs.oracle.com/javase/tutorial/essential/regex/

1 votes

Cela ne fonctionnera pas pour les phrases entières. String.matches() ne renvoie que true si la chaîne entière correspond.

0 votes

Vous pouvez donc faire quelque chose comme "*\\s+" + word + "\\s+*" comme votre regex, n'est-ce pas ? Cela devrait fonctionner pour les phrases... (ce n'est probablement pas la bonne syntaxe, mais c'est l'idée générale)

1 votes

Oui. Cela pourrait fonctionner (en quelque sorte). Je vous suggère également de consulter Pattern y Matcher sur la documentation Java. Les deux sont des classes utilisées pour la correspondance de chaînes de caractères regex, la première pour la génération du motif, et la seconde pour la recherche. (Évidemment)

2voto

broomweed Points 21

Si vous voulez faire correspondre un mot dans une phrase, même avec la ponctuation, vous aurez besoin d'une regex comme celle-ci :

  static boolean matchesWord(String toMatch, String matchIn) {
     return Pattern.matches(".*([^A-Za-z]|^)"+toMatch+"([^A-Za-z]|$).*", matchIn);
  }

(Vous pouvez utiliser \W mais les traits de soulignement ne sont pas considérés comme une ponctuation).

La simple concaténation d'espaces au début et à la fin de la chaîne ne correspondra pas, par exemple, au mot "programmeur" dans la chaîne "Je suis un programmeur Java", car il n'y a pas d'espace à la fin. Elle ne correspondra pas non plus aux mots situés directement avant ou après la ponctuation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X