正则表达式一行来提取模式匹配组
使用 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);