Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java查找句子中的确切单词_Java_String - Fatal编程技术网

使用Java查找句子中的确切单词

使用Java查找句子中的确切单词,java,string,Java,String,我正在写一个代码,以便在文本中找出国家名称。我正在使用一本字典,上面有印度、美国、斯里兰卡等国家的名字。我目前正在使用字典中的text.contains(key)和key。但是,即使对于像Indiana这样的字符串,也会返回true。我试着把句子中的单词放在一个数组中,然后进行包含,类似的方法也可以用equals来考虑,但它们确实很慢。还有其他更快的方法吗?contains()应该可以。您也可以尝试String.indexOf(String)。如果返回的不是-1,则该查询字符串存在于所述字符串中

我正在写一个代码,以便在文本中找出国家名称。我正在使用一本字典,上面有印度、美国、斯里兰卡等国家的名字。我目前正在使用字典中的
text.contains(key)
key
。但是,即使对于像
Indiana
这样的字符串,也会返回true。我试着把句子中的单词放在一个数组中,然后进行包含,类似的方法也可以用equals来考虑,但它们确实很慢。还有其他更快的方法吗?

contains()
应该可以。您也可以尝试
String.indexOf(String)
。如果返回的不是-1,则该查询字符串存在于所述字符串中,否则不存在。

尝试使用class
\b

s.matches(".*\\b" + key + "\\b.*")

也许你应该使用一些文本处理库

下面是一个正则表达式解决方案:

import java.util.regex.*;
import static java.lang.System.*;
public class SO {
    public static void main(String[] args) {
        String[] dict={"india","america"};
        String patStr=".*\\b(" + combine(dict,"|") + ")\\b.*";
        out.println("pattern: "+patStr+"\n");
        Pattern pat=Pattern.compile(patStr);

        String input1="hello world india indiana";
        out.println(input1+"\t"+pat.matcher(input1).matches());

        String input2="hello world america americana";
        out.println(input2+"\t"+pat.matcher(input2).matches());

        String input3="hello world indiana amercana";
        out.println(input3+"\t"+pat.matcher(input3).matches());
    }
    static String combine(String[] s, String glue){
      int k=s.length;
      if (k==0) return null;
      StringBuilder out=new StringBuilder();
      out.append(s[0]);
      for (int x=1;x<k;++x)
        out.append(glue).append(s[x]);
      return out.toString();
    }
}

你为什么不把你认为慢的代码的相关部分张贴出来?这将更容易理解您正在做什么,并帮助您改进它。
contains()
对于您可能发现的部分匹配返回true。但是您是如何确定
equals()
contains()慢的呢?可能是我没有很好地理解你的问题。如果我必须检查每个单词,那么我将不得不拆分文本(即:我输入的句子),然后将其与字典中的每个键进行匹配。这就是我所说的“慢”的意思。如果我能正确地传达它,对不起!另一方面,如果我直接使用contains,我不需要拆分输入文本,但是它也会提供部分匹配。的可能重复
pattern: .*\b(india|america)\b.*

hello world india indiana       true
hello world america americana   true
hello world indiana amercana    false