Вы должны использовать Matcher
для каждой строки, ваш код должен выглядеть следующим образом:
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(line ->
{
Matcher matcher = pattern.matcher(line);
while (matcher.find()){
System.out.println("Match: " + matcher.group(1));
}
}
);
} catch (Exception e) {
e.printStackTrace();
}
Функции Java 9+
В Java 9+ вы можете использовать Matcher#results()
во втором примере, поэтому это может быть:
Pattern pattern = Pattern.compile(".?Test (.)");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(input -> pattern.matcher(input)
.results()
.forEach(matcher -> System.out.println("Match: " + matcher.group(1)))
);
} catch (Exception e) {
e.printStackTrace();
}
Или как @ Хольгер упомяните, что вы можете использовать flatMap
с Matcher#results()
примерно так:
try (Stream<String> lines = Files.lines(path)) {
lines.flatMap(input ->
pattern.matcher(input).results()
).forEach(matchResult -> System.out.println("Match: " + matchResult.group(1)));
} catch (IOException e) {
e.printStackTrace();
}
Или даже вы можете прочитать весь файл, используя Сканер, где вы можете использовать Scanner::findAll
, которые возвращают Поток вот так:
try (Scanner scanner = new Scanner(path)) {
scanner.findAll(pattern).forEach(matchResult ->
System.out.println("Match: " + matchResult.group(1))
);
} catch (IOException e) {
e.printStackTrace();
}
Выходы
Match: 1
Match: 2
Match: 3
Вы можете взглянуть на эти два обратных порта results()
и findAll()
@Holger: