从字符串中提取以特定字符开头的单词

时间:2015-04-03 08:52:21

标签: java string extraction

我收到了以下字符串:

 String line = "#food was testy. #drink lots of. #night was fab. #three #four";

我想从中#food #drink #night #three#four

我试过这段代码:

    String[] words = line.split("#");
    for (String word: words) {
        System.out.println(word);
    }

但它提供了food was testydrink lots ofnigth was fabthreefour

2 个答案:

答案 0 :(得分:12)

split只会在找到的地方剪切整个字符串。这解释了你目前的结果。

您可能想要提取每个字符串的第一个单词,但执行任务的好工具是RegEx

在这里你可以如何实现它:

String line = "#food was testy. #drink lots of. #night was fab. #three #four";

Pattern pattern = Pattern.compile("#\\w+");

Matcher matcher = pattern.matcher(line);
while (matcher.find())
{
    System.out.println(matcher.group());
}

输出是:

#food
#drink
#night
#three
#four

魔术发生在“#\ w +”中。

因此,我们搜索以#开头,后跟一个或多个字母,数字或下划线的内容。

由于Escape Sequences,我们对'\'使用'\\'。

你可以玩它here

解释了{p> findgroup here

  • find方法扫描输入序列,寻找与模式匹配的下一个子序列。
  • group()返回上一场比赛匹配的输入子序列。

<强> [编辑]

如果您需要检测重音字符或非拉丁字符,则\w的使用可能会成为一个问题。

例如:

  

“Bonjour mon#bébé#chat。”

比赛将是:

  • #b的
  • #chat

这取决于您将接受的内容 hashTag 。但这是另一个问题multiple discussions exist about it

例如,如果您想要任何语言的任何字符,#\p{L}+看起来不错,但下划线不在其中......

答案 1 :(得分:-1)

请按照以下程序进行操作==&gt;

   String candidate = "#food was testy. #drink lots of. #night was fab. #three #four";

        String regex = "#\\w+";
        Pattern p = Pattern.compile(regex);

        Matcher m = p.matcher(candidate);
        String val = null;

        System.out.println("INPUT: " + candidate);

        System.out.println("REGEX: " + regex + "\r\n");

        while (m.find()) {
          val = m.group();
          System.out.println("MATCH: " + val);
        }
        if (val == null) {
          System.out.println("NO MATCHES: ");
        }

这将给出如下输出,因为我解决了我的netbeans IDE中的问题并测试了程序

INPUT: #food was testy. #drink lots of. #night was fab. #three #four

REGEX: #\w+

MATCH: #food

MATCH: #drink

MATCH: #night

MATCH: #three

MATCH: #four

您需要以下导入

import java.util.regex.Matcher;
import java.util.regex.Pattern;