如何使用Java从特定行开始读取TextFile

时间:2018-08-07 09:11:50

标签: java regex string file

我要开始从特定行读取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之前)

2 个答案:

答案 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,缺少dropWhiletakeWhile方法。相反,您可以使用现有的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”时,文件将自动关闭。