正则表达式一行来提取模式匹配组

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

鉴于此正则表达式和字符串:

String regexp = "(ddd)-(d)-(dd)";
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) 方法?

回答

你非常接近。您需要平面映射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);


以上是正则表达式一行来提取模式匹配组的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>