在Java中以长文本查找给定子字符串的第一个匹配的完整单词

时间:2018-10-02 17:42:39

标签: java regex string

我有一个完整的句子,如下所示。

“ Stackoverflow是最好的,stackoverflow.com很棒!”

我需要找到匹配给定子字符串的第一个完整单词。例如,如果输入为“ overflow”,则结果应为“ 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 :(得分:2)

  

我的代码可能出什么问题了?

因为您的正则表达式仅匹配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*匹配零个或多个非空格字符


备选方案二:使用split并遍历每个单词,然后在找到单词时中断

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;
    }
}

答案 1 :(得分:1)

问题在于,您不使用令牌中的正则表达式。您只需在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


  • 所有单词(以任何字符开头)都包含“ overflow” +“。”。 +任何字符

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

    整个单词是stackoverflow.com

  

[a-zA-Z]-包括任何字母字符

     

'+'加号是一个或多个匹配量词。

     

。点与换行符以外的任何字符匹配。

  • 还可以添加特殊符号“ |” (或)搜索更多变体,但要小心-如果模板适合不同的变体,则只会确定第一个变体。

    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