我正在寻找一种从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)也是受欢迎的。
答案 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]);
}
}
这是一个可运行的例子:
答案 2 :(得分:0)
答案 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)
}
}