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

7
我想知道是否存在一种简单的方法来从StringBuilder对象中删除最后一行,而不知道最后一行中字符的数量。
示例:

你好,你怎么样?
很好,谢谢!
好的,完美...

我想要删除“好的,完美...”

你说的最后一行是什么意思?能否分享一个字符串样例并展示你想要移除哪一部分? - Amit.rk3
请使用 lastIndexOf(String str) 方法,该方法返回指定子字符串最右边出现的位置索引。 - MaxZoom
3个回答

13
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


1
这并不会删除最后一行,而是删除最后的\n(如果每行都以它结尾)。 - MaxZoom
“\n” 可能出现在字符串的末尾,也可能根本不存在。 - MaxZoom
2
StringBuilder sb = new StringBuilder("Hello, how are you?\nFine thanks!\nOk, Perfect...\n"); 这个怎么样? - Hiren
3
@Hiru,在这种情况下,我会说最后一行是空的! - ericbn
多个结尾非空行怎么办? - Thomas

3

根据你的字符串构造方式和目标,如果不添加最后一行到 StringBuilder 中而是将其移除可能更容易实现。


1

根据您的性能要求,有几个选项:

一个选项,就像其他人已经提到的一样,是查找\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]+$")。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接