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);
Демо