首页 > 解决方案 > 正则表达式一个衬里来提取模式匹配组

问题描述

使用 Java 11,我想知道如何使用 Stream API 将所有组匹配项提取到单行中的字符串列表中。

给定这个正则表达式和字符串:

String regexp = "(\\d\\d\\d)-(\\d)-(\\d\\d)";
String str = "123-8-90";

我知道如何在多行中获得结果:

Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(str);

List<String> matches = new ArrayList<>();
if (matcher.find()) {
  matches.add(matcher.group(1));
  matches.add(matcher.group(2));
  matches.add(matcher.group(3));
}

System.out.println(matches);

这将打印 3 个不同数字字符串的预期列表:[123, 8, 90]

我试图在一个班轮中实现同样的目标:

List<String> matches = Pattern.compile(regexp)
    .matcher(str)
    .results()
    .map(MatchResult::group)
    .collect(Collectors.toList());

System.out.println(matches);

这会打印出意外:[123-8-90]

如何在流中使用 MatchResult::group(int) 方法?

标签: javaregexjava-stream

解决方案


你非常接近。您需要平面映射MatchResult#group

List<String> matches = Pattern.compile(regexp)
    .matcher(str)
    .results()
    .flatMap(mr -> IntStream.rangeClosed(1, mr.groupCount())
        .mapToObj(mr::group))
    .collect(Collectors.toList());

System.out.println(matches);

推荐阅读