0

我想在文件中找到一个特殊的字符序列,并且我想读取出现的整行。

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

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

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

模式和文件是参数

4

1 回答 1

1

根据对此答案的评论更新答案

实际上,使用的是Scanner#findWithHorizo​​n,它实际上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();
}

为了完整起见,我应该补充一点,我前段时间开发了一个包,它允许将任意长度的文本文件作为 a 读取,CharSequence并且可以在这里发挥很大的作用:https ://github.com/fge/largetext 。Matcher由于 a 与 a匹配CharSequence,而不是 a匹配,它在这里会很好地工作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());
    }
}
于 2016-08-20T12:21:00.673 回答