Java,如何在文件中找到模式并读取整行?

时间:2016-08-20 11:52:45

标签: java file java.util.scanner findinfiles pattern-finding

我想在文件中找到一个特殊的charsequence,我想读取出现的整行。

以下代码只检查第一行并提取此(第一行)行。 我该如何解决?

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

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

模式和文件是参数

1 个答案:

答案 0 :(得分:0)

根据对此答案的评论

更新的答案

实际上,使用的是Scanner#findWithHorizon,它实际上使用一组标志(Pattern#compile(String, int))调用Pattern#compile方法。

结果似乎是在输入文本中一遍又一遍地应用这种模式在文件的行上;当然,这假设一个模式不能同时匹配多行。

因此:

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 。由于MatcherCharSequence匹配,而不是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());
    }
}