如何使用Java检查句子中是否存在单词?

时间:2014-04-30 04:08:16

标签: java pattern-matching

我是编程和处理函数的新手,如果句子中有单词,则返回true。我尝试了indexOf()方法,但后来我也遇到了这种方法的某个问题:

假设我的句子是I am a, Java Programmer.

如果我们使用ram方法查找单词indexOf(),则会返回true,因为ram中存在Programmer,而正确的输出应该falseram,因为boolean isPresent(String word, String sentence) { if(sentence.indexOf(word) >= 0) return true; else return false; } 不是一个单词,而是一个模式。

我该如何解决这个问题?我现在使用的代码是:

ram

注意:单词ram只是一个示例,用于显示我当前方法的一个问题。我不是必须只使用a所有时间。这个词可以是任何类似的说{{1}},后面跟着一个逗号。

更新:感谢大家提供他们的意见和解决方案。我选择了一个作为接受的答案(如果允许,会选择更多:-)),但很多都是有帮助的。

12 个答案:

答案 0 :(得分:39)

尝试正则表达式

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

\ b表示字边界

答案 1 :(得分:21)

由于您要搜索单词,因此有三种情况:

  1. 句子开头的单词表示开始时没有空格,但结尾处有空格。
  2. 两端句子空间之间的单词。
  3. 在结尾只有空格。
  4. 为了涵盖所有这三种情况,一种可能的解决方案是:

    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
    

    Here is working Demo

答案 2 :(得分:10)

问题:

你如何定义一个单词?

可能的答案:

由一些其他字符分隔的一堆字符。第二组字符由您选择的内容定义。假设您选择这些. ,?;。因此,如果您使用这些字符(称为delimiters)拆分输入字符串,您将获得一串单词的字符串。现在要查找输入是否包含单词,循环遍历这些字符串以检查它们是否与您的查询匹配。

代码:

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:

如果您希望将单词定义为包含字母,数字和下划线的任何内容,则可以为您准备一个正则表达式:\W+

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

如果您想了解有关Java Regex的更多信息,请考虑阅读this article

答案 3 :(得分:2)

查看String.matches()方法。如果你正确构造正则表达式,它应该能够做你想要的。开始使用正则表达式的好地方是Java教程:http://docs.oracle.com/javase/tutorial/essential/regex/

答案 4 :(得分:2)

如果你想匹配句子中的单词,即使是标点符号,你也需要这样的正则表达式:

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

(您可以使用\ W,但不会将下划线视为标点符号。)

只是将空格连接到开头和结尾将不匹配,例如,字符串“我是Java程序员”中的“programmer”一词,因为最后没有空格。它也不会在标点符号之前或之后直接匹配单词。

答案 5 :(得分:1)

试试这个解决方案

    int index = sent.indexOf(find);
    if (index != -1) {
        if (index == 0) {
            System.out.println("true");
        }
        else if (index + find.length() == sent.length())
        {
            System.out.println("true");
        }
        else if (sent.charAt(index - 1) == ' ' && sent.charAt(find.length() + index) == ' ') {
            System.out.println("true");
        } else {
            System.out.println("false");
        }

    } else {
        System.out.println("false");
    }

如果你想要的东西比你原来的问题更多,那么你应该检查它们是否在0-9和a-Z之间来检查空格,这应该涵盖任何字符,如逗号句号等。

答案 6 :(得分:1)

String s="I am a JAVA programmer";
    String s1="JAVA";
    String []p=s.split("\\s*(=>|,|\\s)\\s*");
        for(int i=0;i<p.length;i++)
        {
            if(s1.equals(p[i]))
            {
                System.out.println(p[i]);
            }

        }

答案 7 :(得分:1)

更简单的方法是:如果你认为某个词就像

那样
  

&#34;我的电脑有 ram 记忆&#34; (在空格之间)

你可以在你正在搜索的单词之前和之后连接到你的indexOf函数空间,就像这样

  

if(sentence.indexOf(&#34;&#34; + word +&#34;&#34;)&gt; = 0){

答案 8 :(得分:1)

这将起作用,假设每个单词用空格分隔。为了清晰起见,我添加了主要功能。如果单词不存在,find_str返回-1。否则,它返回单词相对于其他单词的位置。这里将返回2,这意味着第二个单词是'am'。

import java.util.*;
public class HelloWorld{

    public static void main(String []args){
        String str="I am a Java Programmer";
        String str1="am";
        int x=find_str(str,str1);
        System.out.println(x);

    }

    public static int find_str(String main,String search) {

        int i; 
        int found=-1;

        String[] s=main.split(" ");
        for(i=0;i<s.length;i++)
        {
            if(search.equals(s[i]))
            found=i+1;
        }
        return found;
    }
}

答案 9 :(得分:0)

这是一个相当笨拙的解决方法,但应该取得正确的结果。在字符串中找到您要查找的子字符串,并在子字符串之前和之后找到字符串。使用它们的ascii值(int)substring.charAt(x);检查这些值,看它们是否是字母。如果它们都不是字母,或者超出字符串的范围,你就知道你找到了一个字。否则,你知道它只是一个单词的一部分。

逻辑将会很长 - 这就是为什么我不为你编码的原因,但是如果你需要澄清那么请试一试并告诉我。

答案 10 :(得分:0)

HLO。您可以将句子拆分为数组,然后将其放入List中。之后,您可以使用contains方法检查单词是否存在。请试试这个代码..

import java.util.ArrayList;
import java.util.Arrays;


 public class karthitest {
  public static void main(String[] args) {
    String sentence = "I am Karthick";
    String word = "I";

    if(isWordExist(sentence, word)){
    System.out.println("Word is exist");
    }
}

public static boolean isWordExist(String sentence, String word){
    boolean ans = Boolean.FALSE;        
    ArrayList<String> wordList = null;

    try {

        if(sentence != null && word != null){
            wordList = new ArrayList<String>(Arrays.asList(sentence.split("[^a-zA-z]+")));              
            if(wordList.contains(word)){
                ans = Boolean.TRUE;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
    }
    return ans;
}

}

答案 11 :(得分:-4)

使用包含方法

boolean isPresent(String word, String sentence)
{
return sentence.contains(word);   
}

编辑:     如果你想搜索一个pariticular字,那么你可以添加空格befaore和字符串
后     word =“”+ word +“”;