我正在尝试在一个大文本文件中查找(使用正则表达式),第一行的内容为“ False”而不是“ True”。在这种情况下,有多行。
文本文件示例:
test, test, test, True, test, test, test, True, test, test, test, False, (i want this line) test, test, test, False, test, test, test, True, test, test, test, True, test, test, test, False,(and that) test, test, test, False, test, test, test, True, test, test, test, True,
我正在逐行读取文件。总是在读取的行与“ True”正则表达式匹配时才读取下一行,并尝试下一行是否与“ False”正则表达式匹配。如果是这样(现在),它应该打印行。
try {
BufferedReader br =
new BufferedReader(new FileReader(C:\\Directory\\test.txt)
String lineRead;
while ((lineRead = br.readLine()) != null) {
if(lineRead.matches( ".*True.*")){
if((lineRead = br.readLine()) != null){
if((lineRead.matches( ".*False.*"))){
System.out.println(lineRead);
}
}
}
}
}
它给了我大部分内容,但不是全部。这些线相隔几千行。 “假”行始终是数百个后续行。因此,“超跳”应该不会有问题。
答案 0 :(得分:2)
您的问题的格式绝对是一团糟,但这是您真正需要的:
boolean flag = false;
while ((lineRead = br.readLine()) != null) {
if (lineRead.matches(".*\\bTrue\\b.*")) {
flag = true;
}
else if (lineRead.matches(".*\\bFalse\\b.*")) {
if (flag) {
System.out.println(lineRead);
flag = false;
}
}
}
布尔值flag
跟踪上一行的状态。仅当包含false的行是前一个true行之后的第一行false时,才打印该行。并且,在解析完错误行之后,我们将标志设置为false,以防止第二条错误行开始被打印。
答案 1 :(得分:0)
另一个更简单且不太冗长的解决方案如下:
private static void findFalse() {
try(var stream = Files.lines(Paths.get(PATH))) {
stream.filter(PATTERN.asPredicate())
.forEach(System.out::println);
} catch (IOException e) {
System.err.println("An error has occurred:: " + e.getMessage());
}
}
首先从定义Pattern
开始,如下所示:
private static final Pattern PATTERN = Pattern.compile(".*\\bFalse\\b.*");
然后只需打开文件行的流,使用您定义的模式进行过滤,并将每条匹配的行输出到标准输出。
通过这种方式,您将避免设置标记以及手动进行整个阅读过程。
答案 2 :(得分:0)
我将以您给出的示例遍历您的原始代码。
第5行:读取输入第1行
第6行:通过,因此读取输入第2行
第7行:失败
第5行:读取输入第3行
第6行:失败
第5行:读取第4行
...
因此,第一组“假”行将不会显示,类似于由2条“真”行分隔的任何一组假行。