Java, Как я могу найти шаблон в файле и прочитать всю строку?

java file java.util.scanner findinfiles pattern-finding

1185 просмотра

1 ответ

Я хочу найти специальную последовательность символов в файле и прочитать всю строку, где находятся вхождения.

Следующий код просто проверяет первую строку и выбирает эту (первую) строку. Как я могу это исправить?

   Scanner scanner = new Scanner(file);
   String output = "";

    output = output + scanner.findInLine(pattern) + scanner.next();

шаблон и файл являются параметрами

Автор: rootBoy Источник Размещён: 08.11.2019 11:16

Ответы (1)


0 плюса

ОБНОВЛЕННЫЙ ОТВЕТ согласно комментариям к этому самому ответу

Фактически, используется 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());
    }
}
Автор: fge Размещён: 20.08.2016 12:21
Вопросы из категории :
32x32