在不知道字符数的情况下从 StringBuilder 中删除最后一行

Remove last line from a StringBuilder without knowing the number of characters

我想知道是否有一种简单的方法可以在不知道最后一行字符数的情况下从 StringBuilder 对象中删除最后一行。

示例:

Hello, how are you?
Fine thanks!
Ok, Perfect...

我想删除"Ok, Perfect..."

StringBuilder sb = new StringBuilder("Hello, how are you?\nFine thanks!\nOk, Perfect...");

int last = sb.lastIndexOf("\n");
if (last >= 0) { sb.delete(last, sb.length()); }

http://ideone.com/9k8Tcj

编辑: 如果要删除最后一个非空行,请执行

StringBuilder sb = new StringBuilder(
        "Hello, how are you?\nFine thanks!\nOk, Perfect...\n\n");
if (sb.length() > 0) {
    int last, prev = sb.length() - 1;
    while ((last = sb.lastIndexOf("\n", prev)) == prev) { prev = last - 1; }
    if (last >= 0) { sb.delete(last, sb.length()); }
}

http://ideone.com/AlzQe0

根据字符串的构造方式和目标,不将最后一行添加到 StringBuilder 而不是删除它可能更容易。

根据您的性能要求,有以下几种选择:

正如其他人已经提到的,一个选项是查找 \n 的最后一个索引,如果它是最后一个字符,则递归查找倒数第二个索引等,直到找到最后一个非空行。

另一种选择是使用正则表达式来查找:

StringBuilder sb = new StringBuilder("Hello, how are you?\nFine thanks!\nOk, Perfect...\n\n");
Pattern p = Pattern.compile("\n[^\n]+\n+$");
Matcher m= p.matcher( sb );

//if there is a last line that matches our requirements
if( m.find() ) {
  sb.delete( m.start( 0 ), m.end( 0 ) );
}

如果您认为空格为空,您可以将表达式更改为 \n[^\n]+[\s\n]+$(作为 Java 字符串,即 "\n[^\n]+[\s\n]+$")。