我要开始从特定行读取TextFile 我有一个这样的文本文件
#11
mango
apple
orange
END
#22
dog
cat
monkey
END
#33
car
bus
van
END
在这里,我希望所有行都在#22和END之间
String text = new String(Files.readAllBytes(Paths.get("mypath")),
StandardCharsets.UTF_8);
//multiple lines to single line
text=text.replaceAll("[\r\n]+", " ");
Pattern pattern = Pattern.compile("#22(.*?)END");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
它以一行的形式输出(狗猫的钱)。如何仅从文件(逐行)中获取以下行
dog
cat
monkey
我不确定特定数字之后是哪个数字(#22)。例如#33。任何方法只能使用#22和END(在#33之前)
答案 0 :(得分:2)
要匹配最后一个END,您需要使用$
这样的锚点,例如"#22(.*?)END$"
,这意味着文件结尾,或者可以删除?
,您的正则表达式应类似于"#22(.*)END"
< / p>
您还提到了:
如何仅从文件中获取以下行(逐行)
您可以像这样使用Pattern.DOTALL
:
//text = text.replaceAll("[\r\n]+", " ");// no need to this
Pattern pattern = Pattern.compile("#22(.*)END", Pattern.DOTALL);
这将返回:
dog
cat
monkey
END
#33
car
bus
van
修改
我想要在#22和结尾(在#33之前)之间的文本
在此可以使用此正则表达式#22((.*)#33(.*?))END
Pattern pattern = Pattern.compile("#22((.*)#33(.*?))END", Pattern.DOTALL);
修改
有没有办法不直接给出#33? 会不正常
在这种情况下,您可以使用该号码,该号码可以由用户指定:
int number = 33;
String regex = String.format("#22((.*)#%d(.*?))END", number);
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
答案 1 :(得分:2)
YCF_L的答案给出了正确的结果,但是如果文件很大,即使您只使用其中的一小部分,它也会将整个内容读入内存。为了避免这种情况,并一次处理一行,如果您有Java 10,可以这样做:
try (Stream<String> lines = Files.lines(Paths.get("out/production/scratch/file.txt"))) {
lines
.dropWhile(line -> !line.equals("#22"))
.skip(1)
.takeWhile(line -> !line.equals("END"))
.forEachOrdered(System.out::println);
}
但是您声明只有Java 8,缺少dropWhile
和takeWhile
方法。相反,您可以使用现有的Java 7方法:
try (BufferedReader br = Files.newBufferedReader(Paths.get("out/production/scratch/file.txt"))) {
String line;
while ((line = br.readLine()) != null && !line.equals("#22"))
; // skip lines
while ((line = br.readLine()) != null && !line.equals("END"))
System.out.println(line);
}
请注意,在两个示例中,都使用了try-with-resources语句,以便在遇到“#22”之后的第一行“ END”时,文件将自动关闭。