java - 正则表达式一个衬里来提取模式匹配组
问题描述
使用 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) 方法?
解决方案
你非常接近。您需要平面映射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);
推荐阅读
- javascript - 如何将变量传递给对象方法
- javascript - javascript 在使用 while 语句时忽略我的 IF 语句
- javascript - 过滤 $lookup 的结果
- html - Material-UI Pickers:将日期显示为(M、DD、YYYY)->(2019 年 4 月 17 日)
- javascript - 如何防止事务写入冲突和异步运行事务?
- r - jsonlite:来自 Python 请求包的对象上的 toJSON 会导致数组,直接调用 API 不会
- mysql - 我被逻辑困住了,也许我做错了 SQL
- python - Ansible任务创建目录并检查是否存在失败
- ubuntu - 如何将持久静态路由添加到由 Network Manager 管理的 Ubuntu?
- ios - 如果不是从 Xcode 运行,iOS 应用程序会立即崩溃