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

使用 Java 流的模式匹配

濮翰学
2023-03-14

我已经实现了使用regex从字符串中提取一些值的逻辑,如下所示。

for(int i = 0; i < fragmentedHeader.length - 1; i++) {
    if(fragmentedHeader[i + 1].contains("ads_management")) {
        Pattern pattern = Pattern.compile("[0-9]{15}");
        Matcher matcher = pattern.matcher(fragmentedHeader[i]);
        while (matcher.find()) {
            catalogIds.add(matcher.group());
        }
    }
}

它按预期工作。我现在必须使用java流实现此逻辑,以使其更具可读性。我只是想让它更具可读性,更容易看到。我已经实现了使用这个,但它没有工作任何建议。

Pattern pattern = Pattern.compile("[0-9]{15}");
catalogIds = IntStream.range(0, fragmentedHeader.length - 1)
    .filter(index -> fragmentedHeader[index+1].contains("ads_management") && pattern.matcher(fragmentedHeader[index]).find())
    .mapToObj(index -> fragmentedHeader[index])
    .collect(Collectors.toList());

catalogIds = catalogIds.stream()
    .map(header -> pattern.matcher(header).group())
    .collect(Collectors.toList());

我得到的错误是没有找到匹配。但是有没有办法给下一个流提供matcher呢

.filter(index -> fragmentedHeader[index+1].contains("ads_management") && pattern.matcher(fragmentedHeader[index]).find())
.mapToObj(index-> pattern.matcher(fragmentedHeader[index]).group())

共有1个答案

冯祺
2023-03-14

您可以使用<code>Matcher方法。results()为与模式匹配的输入序列的每个子序列获取匹配结果流。这也将使您能够一次完成任务,而不是像现在这样将子结果存储在列表中的中间步骤。

List<String> catalogIds =
IntStream.range(0, fragmentedHeader.length - 1)
        .filter(index -> fragmentedHeader[index+1].contains("ads_management"))
        .mapToObj(index -> fragmentedHeader[index])
        .flatMap(str -> Pattern.compile("[0-9]{15}").matcher(str).results())
        .map(MatchResult::group)
        .collect(Collectors.toList());
 类似资料:
  • 问题内容: 我正在尝试读取一个大文件,并将“引号”中的文本提取出来,并将这些行放入集合中,然后使用Java 8将集合的内容写入文件中。 请帮我。谢谢! 编辑:问题的答案。 不,没有多引号的文字。 我本可以使用简单的循环。但是我想使用Java 8流 问题答案: 不幸的是,Java正则表达式类不提供匹配结果的流,仅提供一种方法,但您不想拆分。 注意:它已 在Java 9中 作为Matcher.resu

  • 这是一个示例文本:。我无法修改输入文本,我正在从文件中读取长字符串文本。 我想提取以下内容:,,, 为此,我编写了以下正则表达式模式: 我正在使用和类,但是我的Matcher无法使用前面提到的正则表达式找到模式。我在一些在线regex网站上用文本测试了这个regex,令人惊讶的是,它在那里工作。 我哪里做错了? 原始代码: 输出:未打印任何内容

  • 或者更好的方法是遍历它,为参数的每个索引获取TRUE或FALSE标志 我只知道如何使用matcher.find()进行循环,如果有任何帮助,我将不胜感激

  • 我读了很多帖子提到删除匹配模式的键。我想删除与特定模式不匹配的键。

  • 我试图读取一个巨大的文件,提取“引号”中的文本,将行放入一个集合,并使用Java8将集合的内容写入一个文件。 不,没有多个引用的文本。 我本可以使用简单循环。但是我想使用Java 8 Streams

  • 本文向大家介绍java模式匹配之蛮力匹配,包括了java模式匹配之蛮力匹配的使用技巧和注意事项,需要的朋友参考一下 java模式匹配之蛮力匹配 使用示例: 以上所述就是本文的全部内容了,希望大家能够喜欢。