当前位置: 首页 > 知识库问答 >
问题:

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

郑正文
2023-03-14

我得到以下字符串

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

我想从里面拿走食物和饮料。

我尝试了以下代码:

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

但它给人的感觉是,食物很刺激,喝了很多,离食物很近,三个和四个。

共有2个答案

沈凯康
2023-03-14

请按照程序执行==

   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;
孟均
2023-03-14

拆分只会在找到#的位置剪切整个字符串。这就解释了你目前的结果。

您可能希望提取每段字符串的第一个单词,但执行任务的好工具是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”中。

  • #模式以#
  • 开头
  • \w匹配任何字母(a-z、A-Z)、数字(0-9)或下划线。
  • 匹配一个或多个连续的\w字符。

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

由于转义序列,我们将'\\'用于'\'。

你可以在这里玩。

此处解释了查找和分组:

  • find方法扫描输入序列,寻找与模式匹配的下一个子序列

[编辑]

如果需要检测重音字符或非拉丁字符,则可能会出现问题。

例如在:

"你好,我的#bébé#聊天。"

匹配项将是:

  • #b
  • #聊天

这取决于您将接受什么样的标签。但这是另一个问题,对此存在着多种讨论。

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

 类似资料:
  • 问题内容: 我想在elasticsearch中编写一个查询,这样它只会给出字符串从特定单词开始的结果,例如,如果我要搜索“ Donald”,则我现在有一个字符串“ Donald Duck”,而另一个字符串是“ Alan Donald” “与以下查询 那么结果应该是“ Donald Duck”而不是“ Alan Donald”,因为在“ Donald Duck”中,它以“ Donald”开头。现在有

  • 我有一个字符串: 我想从中提取,即从右边的最后一个或第一个之后的子字符串。 有人能提供一些帮助吗?

  • 我有一个以下格式的Java字符串==ocid1。instancepool。oc1.iad。aaaaaaaa wq4bibigdvw6esvmbia4zhs7dkaposzkzxuvir2ajtfyciih45fa 我想提取第三个和第四个点之间的子串,即“iad”。实现这一点的最佳方式是什么?逻辑应该是通用的,并且应该适用于任何有四个点的字符串。

  • 问题内容: 我有一个看起来像这样的数组: 我如何仅获取以其开头的元素? 问题答案:

  • 问题内容: 我有一个看起来像这样的字符串: 我如何删除第一个; 但只有在字符串的开头找到它? 使用,将删除 所有 。 问题答案: 普通格式,不带正则表达式: 花费: 0.0369毫秒 (0.000,036,954秒) 与: 注意到: 0.1749毫秒 (0.000,174,999秒)第一次运行(编译),和 0.0510毫秒 (0.000,051,021秒)之后。 显然,已在我的服务器上进行了分析。

  • 所谓字符串,指的就是字符的序列或者“串”。我们要在字符串上执行的第一个操作是提取所有字符中的一个。C++使用方括号([和])执行该操作: apstring fruit = "banana"; char letter = fruit[1]; cout << letter << endl; 表达式fruit[1]表明我们要从字符串变量fruit中取得编号为1的字符,并将结果保存在字符变量letter