Java: String.contains соответствует точному слову

В Java

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

Если я делаю term.contains(subterm_1), он возвращает true. Я не хочу этого. Я хочу, чтобы subterm точно соответствовал одному из слов в term

Поэтому что-то вроде term.contains(subterm_1) возвращает false и term.contains(subterm_2) возвращает true

Ответ 1

\ 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

Ответ 2

Если слова всегда разделены пробелами, это один из способов:

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
}

Ответ 3

Я бы предложил использовать границы слов. Если вы скомпилируете шаблон типа \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

Ответ 4

Вместо этого используйте indexOf, а затем проверьте, есть ли char на poistion

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

или я уверен, что есть также регулярное выражение.

Ответ 5

Я хочу, чтобы подтерм точно соответствовал одному из слов в терминах

Тогда вы не можете использовать contains(). Вы можете разделить термин на слова и проверить равенство (с чувствительностью к регистру или без него).

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

Ответ 6

Так как метод contains проверяет, существует ли этот массив из char в строке, он вернет true, вам придется использовать Regex для выполнения этой проверки.

Если слова aways разделены пробелом, это проще, вы можете использовать regex\s, чтобы получить его.

Вот хороший учебник: http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

Ответ 7

Одним из подходов может быть разбиение строки на пробелы, преобразование ее в список, а затем использование метода contains для проверки точных совпадений, например:

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

Демо