我想在文件中找到一个特殊的字符序列,并且我想读取出现的整行。
以下代码仅检查第一行并获取此(第一行)行。我该如何解决?
Scanner scanner = new Scanner(file);
String output = "";
output = output + scanner.findInLine(pattern) + scanner.next();
模式和文件是参数
我想在文件中找到一个特殊的字符序列,并且我想读取出现的整行。
以下代码仅检查第一行并获取此(第一行)行。我该如何解决?
Scanner scanner = new Scanner(file);
String output = "";
output = output + scanner.findInLine(pattern) + scanner.next();
模式和文件是参数
根据对此答案的评论更新答案
实际上,使用的是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();
}
为了完整起见,我应该补充一点,我前段时间开发了一个包,它允许将任意长度的文本文件作为 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());
}
}