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 个单独的 find
和 group
操作。
关于java - 在文件流上应用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066060/