删除Java中String中的最后n行(句子)

时间:2014-09-23 18:45:27

标签: java string substring

我正在寻找一种从String中删除最后n行的有效方法。快速执行的效率以及不会创建的东西也可能是对象。因此想远离split()。特别是因为,有时,我的琴弦可能是几百行甚至几千行。

例如,我得到一个字符串:

This is a sample code line 1.
This is a sample code line 2.

Warm Regards,
SomeUser.

最后3行(空行,“温馨的问候”和“SomeUser。”)是我想要摆脱的。请注意,内容(包括最后3行)不固定。

我正在考虑首先使用此解决方案对行进行计数:https://stackoverflow.com/a/18816371/1353174然后再使用另一个类似的循环来到达行 - n的位置并执行子串直到该位置。

但是,只是在这里发布此问题,以了解是否有任何其他可能更有效的方法来实现此目的。基于库的外部解决方案(如Apache Commons StringUtils)也是受欢迎的。

4 个答案:

答案 0 :(得分:3)

您可以使用String.lastIndexOf查找“\ n”符号的最后第三次出现,然后执行String.substring以获得结果。

     public static void main(String[] args) {
        String s = "This is a sample code line 1.\n" +
                "This is a sample code line 2.\n" +
                "\n" +
                "Warm Regards,\n" +
                "SomeUser.";

        int truncateIndex = s.length();

        for (int i = 0; i < 3; i++) {
            System.out.println(truncateIndex);
            truncateIndex = s.lastIndexOf('\n', truncateIndex - 1);
        }

        System.out.println(s.substring(0, truncateIndex));
        System.out.println("--");
    }

此代码段故意不关心极端情况,例如输入字符串中少于三行,以使代码简单易读。

答案 1 :(得分:1)

public static final String SAMPLE_TEXT = "This is a sample code line 1.\nThis is a sample code line 2.\r\n\nWarm Regards,\r\nSomeUser.";

public static void main (String[] args) throws java.lang.Exception {
    String[] lines = SAMPLE_TEXT.split("\\r?\\n"); // catches Windows newlines (\r) as well)
    for (int i = 0; i < lines.length - 3; i++) {   // lines.length - 3 to discard the last 3 lines
        System.out.println(lines[i]);
    }
}

这是一个可运行的例子:

http://ideone.com/nwaMcD

答案 2 :(得分:0)

使用正则表达式执行此操作:http://docs.oracle.com/javase/tutorial/essential/regex/

答案 3 :(得分:0)

  @scala.annotation.tailrec
  def rmLines(in: String, nlines: Int): String =
    if (nlines == 0) {
      in
    } else {
      val lastBreakIndex = in.lastIndexOf('\n')
      if (lastBreakIndex == -1) {
        in
      } else {
        rmLines(in.substring(0, lastBreakIndex), nlines - 1)
      }
    }