Нахождение первого подходящего целого слова по заданной подстроке в длинном тексте на Java - PullRequest
0 голосов
/ 02 октября 2018

У меня есть полное предложение, подобное следующему.

"Stackoverflow - лучший, и stackoverflow.com рулит !!!"

Мне нужно найти первое целое слово, соответствующее данной подпрограмме-string.например, если вход «переполнен», результатом должен быть «Stackoverflow» только потому, что это первое слово, содержащее данное слово.

Я попробовал следующий фрагмент, но у меня не работает.

String fullText="Stackoverflow is the best and stackoverflow.com rocks !!!";
String token = "overflow";
Pattern pattern = Pattern.compile(token);
Matcher matcher = pattern.matcher(fullText);
while (matcher.find())
{
     System.out.println("Whole word is "+matcher.group());
}

Я получаю «переполнение» в качестве вывода.Что может быть не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Проблема в том, что вы не используете регулярное выражение в токене.Вы просто отправляете точно строку в Mather, он находит именно эту строку и все.

Если вы хотите указать условия поиска слов, вы можете использовать шаблон регулярных выражений http://www.fon.hum.uva.nl/praat/manual/Regular_expressions_1__Special_characters.html.

В вашем случае это выглядит так: (я добавил в текст еще одно слово: stackowerflowr)


  • все слова, как начинаются любые символы, включают «переполнение» и заканчиваются пробелом:

    String fullText="Stackoverflow is the best and stackoverflow.com rocks !!! stackoverflowr";
    String token = "[a-zA-Z]+overflow ";
    

    Целое слово - Stackoverflow


  • все слова, как начало и конец любых символов(без цифр или символов)

    String fullText="Stackoverflow is the best and stackoverflow.com rocks !!! stackoverflowr";
    String token = "[a-zA-Z]+overflow[a-zA-Z]+"
    

    Целое слово - stackoverflowr


  • все слова, какначать любые символы, включая «переполнение» + «.»+ любые символы

    String fullText="Stackoverflow is the best and stackoverflow.com rocks !!! stackoverflowr";
    String token = "[a-zA-Z]+overflow[.][a-z]+"
    

    Целое слово - stackoverflow.com

[a-zA-Z] - включить любой алфавитchar

'+' знак плюс - это квантификатор совпадения один или более.

.точка соответствует любому символу, кроме символа новой строки.

  • также вы можете добавить специальный символ '|'(или) для поиска других вариантов, но будьте осторожны - если шаблон подходит для разных вариантов, то будет определен только первый

    String fullText="Stackoverflow is the best and stackoverflow.com rocks !!! stackoverflowr";
    String token = "[a-zA-Z]+overflow |[a-zA-Z]+overflow[.][a-z]+";
    

    Целое слово - Stackoverflow

    Целое слово - stackoverflow.com

0 голосов
/ 02 октября 2018

Что может быть не так с моим кодом?

, поскольку ваше регулярное выражение соответствует только overflow, а не слову, содержащему его

Вместо этого используйте следующее регулярное выражение:

\\b\\S*overflow\\S*


String token = "\\b\\S*overflow\\S*";
Pattern pattern = Pattern.compile(token);
Matcher matcher = pattern.matcher(fullText);
if (matcher.find())
{
     System.out.println("Whole word is :"+matcher.group());
}

объяснение:

  • \b соответствует границе слова

  • \\S* соответствует нулю или более без пробела

  • overflow буквально переполняется

  • \\S* соответствует нулю или болеенепробельные символы


Альтернатива два: использование разделения и итерации по каждому слову и разрывание при нахождении слова

String fullText="Stackoverflow is the best and stackoverflow.com rocks !!!";
String [] strWords = fullText.split("\\s");
for(String strWord:strWords){
    if(strWord.contains("overflow")){
        System.out.println(strWord);
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...