gpt4 book ai didi

java - 在文件流上应用模式

转载 作者:搜寻专家 更新时间:2023-10-31 19:44:39 26 4
gpt4 key购买 nike

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 个单独的 findgroup操作。

关于java - 在文件流上应用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com