java - 在文件流上应用模式

标签 java lambda java-8

public final Pattern PATTERN = Pattern.compile("<abc:c\\sabc:name=\"(\\S+)\"\\sabc:type=\"(\\S+)\">");
    try (Stream<String> stream = Files.lines(template.getPath())) {
        stream.filter(s -> PATTERN.matcher(s).find()).forEach(System.out::println);

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

该模式工作正常,但我怎样才能捕捉/获取我的组?目前我只得到字符串。

最佳答案

如果您应用的模式只在一行中出现一次,您可以映射您的 Stream<String>进入Stream<Matcher> ,过滤匹配模式的行,最后通过将它们存储在数组中来提取第 1 组和第 2 组。

try (Stream<String> stream = Files.lines(Paths.get(""))) {
    stream.map(PATTERN::matcher)
          .filter(Matcher::find)
          .map(m -> new String[] { m.group(1), m.group(2) })
          .forEach(a -> System.out.println(Arrays.toString(a)));
} catch (IOException e) {
    e.printStackTrace();
}

如果模式出现不止一次,我们需要遍历 Matcher 直到 find()返回 false .在这种情况下,我们可以

try (Stream<String> stream = Files.lines(Paths.get(""))) {
    stream.map(PATTERN::matcher)
          .flatMap(m -> {
              List<String[]> list = new ArrayList<>();
              while (m.find()) {
                  list.add(new String[] { m.group(1), m.group(2) });
              }
              return list.stream();
          })
          .forEach(a -> System.out.println(Arrays.toString(a)));

在Java 9中,可能会有一个新的方法 Matcher.results() 检索 Stream<MatchResult>结果。我们可以在这里使用它而不是使用 2 个单独的 findgroup操作。

关于java - 在文件流上应用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066060/

相关文章:

java - 我可以在映射时减少吗?

java - 卸载 Android Studio 会删除我的项目吗?

java tcp服务器到多个连接

java - 从 Java : passing functions as parameters 使用 Scala

Java 8 日期时间格式化程序行为不端

group-by - Java 8 按求和条件分组

java - SimpleDateFormat ("ddMMyyyHHmm")只有 3y

c# - 当控制流向锁外的 lambda 函数时,锁会被持久化吗?

C# lambda 表达式作为函数参数

c# - 将 lambda 字符串表达式转换为 Func<string, string> 错误 : "No property or field ' v' exists in type 'String' "