Подтвердить что ты не робот

Как найти целое слово в строке в java

У меня есть строка, которую я должен анализировать для разных ключевых слов. Например, у меня есть строка:

"Я приду и встречу тебя в 123woods"

И мои ключевые слова

'123woods' 'лес'

Я должен сообщать всякий раз, когда у меня есть совпадение и где. Следует учитывать и множественные случаи. Однако для этого я должен получить матч только на 123woods, а не на лесу. Это исключает использование метода String.contains(). Кроме того, я должен иметь список/набор ключевых слов и одновременно проверять их появление. В этом примере, если у меня есть "123woods" и "come", я должен получить два события. Выполнение метода должно быть несколько быстрым в больших текстах.

Моя идея - использовать StringTokenizer, но я не уверен, что он будет работать хорошо. Любые предложения?

4b9b3361

Ответ 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/

Ответ 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