Java:String.contains匹配精确的单词

时间:2014-08-21 02:27:32

标签: java string

在Java中

String term = "search engines"
String subterm_1 = "engine"
String subterm_2 = "engines"

如果我term.contains(subterm_1),则返回true。我不希望这样。我希望subtermterm

中的一个词完全匹配

因此term.contains(subterm_1)之类的内容会返回falseterm.contains(subterm_2)会返回true

7 个答案:

答案 0 :(得分:32)

  

\ b匹配单词边界,其中单词字符为[a-zA-Z0-9 _]。

这应该适合您,您可以轻松地重复使用此方法。

public class testMatcher {
public static void main(String[] args){

    String source1="search engines";
    String source2="search engine";
    String subterm_1 = "engines";
    String subterm_2 = "engine";

    System.out.println(isContain(source1,subterm_1));
    System.out.println(isContain(source2,subterm_1));
    System.out.println(isContain(source1,subterm_2));
    System.out.println(isContain(source2,subterm_2));

}

    private static boolean isContain(String source, String subItem){
         String pattern = "\\b"+subItem+"\\b";
         Pattern p=Pattern.compile(pattern);
         Matcher m=p.matcher(source);
         return m.find();
    }

}

输出:

true
false
false
true

答案 1 :(得分:3)

如果单词总是用空格分隔,这是一种方法:

String string = "search engines";
String[] parts = string.split(" ");
for(int i = 0; i < parts.length; i++) {
    if(parts[i].equals("engine")) {
    //do whatever you want
}

答案 2 :(得分:2)

我建议使用单词边界。如果你编译像\ bengines \ b这样的模式,那么你的正则表达式只匹配完整的单词。

以下是单词边界的解释,以及一些示例。 http://www.regular-expressions.info/wordboundaries.html

此外,这里是模式的java API,它包含单词边界 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

以下是使用上述要求的示例

  Pattern p = Pattern.compile("\\bengines\\b");
  Matcher m = p.matcher("search engines");
  System.out.println("matches: " + m.find());

  p = Pattern.compile("\\bengine\\b");
  m = p.matcher("search engines");
  System.out.println("matches: " + m.find());

这是输出:

matches: true
matches: false

答案 3 :(得分:1)

使用indexOf,然后检查poistion上的char是否

index + length of string plus +1 == ` ` or EOS

或者我确信也有正则表达式。

答案 4 :(得分:1)

  

我希望子项与术语

中的一个词完全匹配

然后你不能使用contains()。您可以将术语拆分为单词并检查相等性(有或没有区分大小写)。

boolean hasTerm = false;
for (String word : term.split("\\s+") {
  if (word.equals("engine")) {
    hasTerm = true;
    break;
  }
}

答案 5 :(得分:1)

由于contains方法验证字符串中是否存在该char数组,因此它将返回true,您必须使用Regex进行此验证。

如果单词被空格分开,则更容易,你可以使用\ s正则表达式来获取它。

这是一个很好的教程:http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

答案 6 :(得分:1)

一种方法可能是用空格分割字符串,将其转换为列表,然后使用contains方法检查完全匹配,如下所示:

String[] results = term.split("\\s+");
Boolean matchFound = Arrays.asList(results).contains(subterm_1);

Demo