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

Vei*_*pse 18 java string

在Java中

String term = "search engines"
String subterm_1 = "engine"
String subterm_2 = "engines"
Run Code Online (Sandbox Code Playgroud)

如果我这样做term.contains(subterm_1)会返回true.我不希望这样.我想要subterm完全匹配其中一个词term

因此,像term.contains(subterm_1)返回falseterm.contains(subterm_2)返回true

Jas*_*key 38

\ 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
false
true
Run Code Online (Sandbox Code Playgroud)


Jef*_* C. 5

我建议使用单词边界。如果你编译一个像\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());
Run Code Online (Sandbox Code Playgroud)

这是输出:

matches: true
matches: false
Run Code Online (Sandbox Code Playgroud)