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

匹配模式并使用Java8 stream将流写入文件

姬墨竹
2023-03-14

我试图读取一个巨大的文件,提取“引号”中的文本,将行放入一个集合,并使用Java8stream将集合的内容写入一个文件。

public class DataMiner {

    private static final Pattern quoteRegex = Pattern.compile("\"([^\"]*)\"");

    public static void main(String[] args) {

        String fileName = "c://exec.log";
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            Set<String> dataSet = stream.
                    //How do I Perform pattern match here
                    .collect(Collectors.toSet());
            Files.write(Paths.get(fileName), dataSet);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
  1. 不,没有多个引用的文本。
  2. 我本可以使用简单循环。但是我想使用Java 8 Streams

共有1个答案

龙安阳
2023-03-14

不幸的是,Java正则表达式类不为匹配的结果提供流,只提供splitasstream()方法,但您不需要split。

注意:它已经作为matcher.results()添加到Java9中。

但是,您可以自己为它创建一个通用帮助器类:

public final class PatternStreamer {
    private final Pattern pattern;
    public PatternStreamer(String regex) {
        this.pattern = Pattern.compile(regex);
    }
    public Stream<MatchResult> results(CharSequence input) {
        List<MatchResult> list = new ArrayList<>();
        for (Matcher m = this.pattern.matcher(input); m.find(); )
            list.add(m.toMatchResult());
        return list.stream();
    }
}

然后,通过使用FlatMap(),您的代码变得简单起来:

private static final PatternStreamer quoteRegex = new PatternStreamer("\"([^\"]*)\"");
public static void main(String[] args) throws Exception {
    String inFileName = "c:\\exec.log";
    String outFileName = "c:\\exec_quoted.txt";
    try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
        Set<String> dataSet = stream.flatMap(quoteRegex::results)
                                    .map(r -> r.group(1))
                                    .collect(Collectors.toSet());
        Files.write(Paths.get(outFileName), dataSet);
    }
}

由于每次只处理一行,所以临时列表就可以了。如果输入字符串很长,并且有很多匹配项,那么拆分器将是更好的选择。参见如何创建regex匹配流?

 类似资料:
  • 问题内容: 我正在尝试读取一个大文件,并将“引号”中的文本提取出来,并将这些行放入集合中,然后使用Java 8将集合的内容写入文件中。 请帮我。谢谢! 编辑:问题的答案。 不,没有多引号的文字。 我本可以使用简单的循环。但是我想使用Java 8流 问题答案: 不幸的是,Java正则表达式类不提供匹配结果的流,仅提供一种方法,但您不想拆分。 注意:它已 在Java 9中 作为Matcher.resu

  • 我已经实现了使用regex从字符串中提取一些值的逻辑,如下所示。 它按预期工作。我现在必须使用java流实现此逻辑,以使其更具可读性。我只是想让它更具可读性,更容易看到。我已经实现了使用这个,但它没有工作任何建议。 我得到的错误是没有找到匹配。但是有没有办法给下一个流提供matcher呢

  • 我正在使用下面的代码片段来保存数据。它只会在同一分区文件夹下创建一个新的拼花地板文件。是否有任何方法可以将数据真正附加到现有的拼花地板文件中。所以,如果一天中有许多附件,我们就不会有多个文件? <代码>测向。聚结(1)。写模式(“追加”)。partitionBy(“paritionKey”)。拼花地板(“…\parquet\u file\u folder\”) 非常感谢你的帮助。

  • 类似定位器参数,文本模式是另一种常用的 Selenium 命令参数。需要使用文本模式的命令,例如:verifyTextPresent, verifyTitle, verifyAlert, assertConfirmation, verifyText, verifyPrompt。上面已经提到,LinkText 定位器可使用文本模式。文本模式使用特殊字符来模糊匹配预期的文本,而不必准确的描述该文本。

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常

  • 主机权限和 内容脚本匹配 是基于匹配模式定义的一组 URL。匹配模式本质上是一个以允许的 schema(http,https,file 或ftp 开头)的URL,并且可以包含 “*” 字符。特殊模式 < all_urls > 匹配以允许的 schema 开头的任何 URL。 每个模式包含 3 个部分: schema - 例如,http 或file 或 * 注意:对文件 URL 的访问不是自动的。用