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());
    }
}
Другие вопросы по тегам