Java, Как я могу найти шаблон в файле и прочитать всю строку?
Я хочу найти специальную последовательность символов в файле и прочитать всю строку, где находятся вхождения.
Следующий код просто проверяет первую строку и выбирает эту (первую) строку. Как я могу это исправить?
Scanner scanner = new Scanner(file);
String output = "";
output = output + scanner.findInLine(pattern) + scanner.next();
шаблон и файл являются параметрами
1 ответ
ОБНОВЛЕННЫЙ ОТВЕТ согласно комментариям к этому самому ответу
На самом деле, используется Scanner # findWithHorizon, который на самом деле вызывает Pattern#compile
метод с набором флагов ( Pattern # compile (String, int)).
Результат, кажется, применяет этот образец снова и снова во входном тексте по строкам файла; и это предполагает, конечно, что шаблон не может соответствовать нескольким строкам одновременно.
Следовательно:
public static final String findInFile(final Path file, final String pattern,
final int flags)
throws IOException
{
final StringBuilder sb = new StringBuilder();
final Pattern p = Pattern.compile(pattern, flags);
String line;
Matcher m;
try (
final BufferedReader br = Files.newBufferedReader(path);
) {
while ((line = br.readLine()) != null) {
m = p.matcher(line);
while (m.find())
sb.append(m.group());
}
}
return sb.toString();
}
Для полноты я должен добавить, что некоторое время назад я разработал пакет, который позволяет читать текстовый файл произвольной длины как CharSequence
и который может быть использован для большого эффекта здесь: https://github.com/fge/largetext. Было бы прекрасно работать здесь, так как Matcher
соответствует CharSequence
не String
, Но эта упаковка нуждается в любви.
Один пример, возвращающий List
из подходящих строк в файле может быть:
private static List<String> findLines(final Path path, final String pattern)
throws IOException
{
final Predicate<String> predicate = Pattern.compile(pattern).asPredicate();
try (
final Stream<String> stream = Files.lines(path);
) {
return stream.filter(predicate).collect(Collectors.toList());
}
}