Как найти целое слово в строке в java
У меня есть строка, которую я должен анализировать для разных ключевых слов.
Например, у меня есть строка:
"Я приду и встречу тебя в 123woods"
И мои ключевые слова
'123woods'
'лес'
Я должен сообщать всякий раз, когда у меня есть совпадение и где. Следует учитывать и множественные случаи. Однако для этого я должен получить матч только на 123woods, а не на лесу. Это исключает использование метода String.contains(). Кроме того, я должен иметь список/набор ключевых слов и одновременно проверять их появление. В этом примере, если у меня есть "123woods" и "come", я должен получить два события. Выполнение метода должно быть несколько быстрым в больших текстах.
Моя идея - использовать StringTokenizer, но я не уверен, что он будет работать хорошо. Любые предложения?
Ответы
Ответ 1
Пример ниже основан на ваших комментариях. Он использует список ключевых слов, которые будут искать в данной строке, используя границы слов. Он использует StringUtils из Apache Commons Lang для создания регулярного выражения и печати сопоставленных групп.
String text = "I will come and meet you at the woods 123woods and all the woods";
List<String> tokens = new ArrayList<String>();
tokens.add("123woods");
tokens.add("woods");
String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
Если вы ищете более высокую производительность, вы можете взглянуть на StringSearch: высокопроизводительные алгоритмы сопоставления шаблонов в Java.
Ответ 2
Используйте символы regex + word, как и другие.
"I will come and meet you at the 123woods".matches(".*\\b123woods\\b.*");
будет истинным.
"I will come and meet you at the 123woods".matches(".*\\bwoods\\b.*");
будет ложным.
Ответ 3
Надеюсь, это сработает для вас:
String string = "I will come and meet you at the 123woods";
String keyword = "123woods";
Boolean found = Arrays.asList(string.split(" ")).contains(keyword);
if(found){
System.out.println("Keyword matched the string");
}
http://codigounico.blogspot.com/
Ответ 4
Как насчет чего-то типа Arrays.asList(String.split(" ")).contains("xx")
?
Смотрите String.split() и Как проверить, содержит ли массив определенный значение.
Ответ 5
Получил способ сопоставить Точное слово от Строка в Android:
String full = "Hello World. How are you ?";
String one = "Hell";
String two = "Hello";
String three = "are";
String four = "ar";
boolean is1 = isContainExactWord(full, one);
boolean is2 = isContainExactWord(full, two);
boolean is3 = isContainExactWord(full, three);
boolean is4 = isContainExactWord(full, four);
Log.i("Contains Result", is1+"-"+is2+"-"+is3+"-"+is4);
Result: false-true-true-false
Функция для слова соответствия:
private boolean isContainExactWord(String fullString, String partWord){
String pattern = "\\b"+partWord+"\\b";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(fullString);
return m.find();
}
Готово
Ответ 6
Попробуйте сопоставить регулярные выражения. Матч для "\ b123wood\b", \b является словом.
Ответ 7
Более простой способ сделать это - использовать split():
String match = "123woods";
String text = "I will come and meet you at the 123woods";
String[] sentence = text.split();
for(String word: sentence)
{
if(word.equals(match))
return true;
}
return false;
Это более простой, менее элегантный способ сделать то же самое без использования токенов и т.д.
Ответ 8
Решение кажется давно принятым, но решение может быть улучшено, поэтому, если у кого-то есть аналогичная проблема:
Это классическое приложение для алгоритмов с несколькими шаблонами.
Поиск шаблона Java (с Matcher.find
) не подходит для этого. Поиск ровно одного ключевого слова оптимизирован в java, поиск или-выражение использует нерегинистический автомат регулярных выражений, который возвращается к несоответствиям. В худшем случае каждый символ текста обрабатывается l раз (где l - сумма длин шаблонов).
Поиск по одному шаблону лучше, но не квалифицирован. Нужно начать весь поиск каждого шаблона ключевого слова. В худшем случае каждый символ текста будет обрабатываться p раз, где p - количество шаблонов.
Поиск нескольких изображений будет обрабатывать каждый символ текста ровно один раз. Алгоритмами, подходящими для такого поиска, будут Aho-Corasick, Wu-Manber или Set Backward Oracle Matching. Они могут быть найдены в библиотеках, таких как Stringsearchalgorithms или byteseek.
// example with StringSearchAlgorithms
AhoCorasick stringSearch = new AhoCorasick(asList("123woods", "woods"));
CharProvider text = new StringCharProvider("I will come and meet you at the woods 123woods and all the woods", 0);
StringFinder finder = stringSearch.createFinder(text);
List<StringMatch> all = finder.findAll();
Ответ 9
public class FindTextInLine {
String match = "123woods";
String text = "I will come and meet you at the 123woods";
public void findText () {
if (text.contains(match)) {
System.out.println("Keyword matched the string" );
}
}
}
Ответ 10
Вы можете использовать регулярные выражения.
Используйте методы Matcher и Pattern для получения желаемого результата
Ответ 11
Вы также можете использовать сопоставление регулярных выражений с флагом \b (граница всего слова).
Ответ 12
Чтобы сопоставить "123woods" вместо "woods", используйте атомарную группировку в регулярном выражении.
Следует отметить, что в строке, которая соответствует только "123woods" , она будет соответствовать первому "123woods" и выйдет вместо поиска той же строки.
\b(?>123woods|woods)\b
он ищет 123woods в качестве основного поиска, после того как он получил соответствие, он выходит из поиска.
Ответ 13
Оглядываясь на исходный вопрос, нам нужно найти некоторые заданные ключевые слова в данном предложении, подсчитать количество вхождений и узнать что-то о том, где. Я не совсем понимаю, что означает "where" (это индекс в предложении?), Поэтому я передам этот... Я все еще изучаю java, шаг за шагом, поэтому я увижу к этому в свое время: -)
Следует заметить, что общие предложения (как в исходном вопросе) могут иметь повторяющиеся ключевые слова, поэтому поиск не может просто спросить, существует ли данное ключевое слово "существует или нет" и считать его как 1, если оно существует. Там может быть больше одного. Например:
// Base sentence (added punctuation, to make it more interesting):
String sentence = "Say that 123 of us will come by and meet you, "
+ "say, at the woods of 123woods.";
// Split it (punctuation taken in consideration, as well):
java.util.List<String> strings =
java.util.Arrays.asList(sentence.split(" |,|\\."));
// My keywords:
java.util.ArrayList<String> keywords = new java.util.ArrayList<>();
keywords.add("123woods");
keywords.add("come");
keywords.add("you");
keywords.add("say");
Посмотрев на это, ожидаемый результат будет 5 для "Say" + "come" + "you" + "say" + "123woods", считая "say" дважды, если мы идем в нижнем регистре. Если мы этого не сделаем, то счет должен быть 4, "Say" исключен и "скажем" включен. Хорошо. Мое предложение:
// Set... ready...?
int counter = 0;
// Go!
for(String s : strings)
{
// Asking if the sentence exists in the keywords, not the other
// around, to find repeated keywords in the sentence.
Boolean found = keywords.contains(s.toLowerCase());
if(found)
{
counter ++;
System.out.println("Found: " + s);
}
}
// Statistics:
if (counter > 0)
{
System.out.println("In sentence: " + sentence + "\n"
+ "Count: " + counter);
}
И результаты:
Найдено: Say
Найдено: приходят
Найдено: you
Найдено: say
Найдено: 123woods
В предложении: Скажите, что 123 нас придут и встретит вас, скажем, в лесу 123woods.
Количество: 5