使用Java从字符串缓冲区中删除子字符串

使用Java从字符串缓冲区中删除子字符串,java,stringbuffer,Java,Stringbuffer,每次出现子字符串时,我都想从字符串缓冲区中删除子字符串,目前为止我所做的是: public static void main(String[] args) { String text = "Alice Bob Alice Bob Alice Bob"; String substr = "Alice"; StringBuffer strbuf = new StringBuffer(text); strbu

每次出现子字符串时,我都想从字符串缓冲区中删除子字符串,目前为止我所做的是:

  public static void main(String[] args) {

        String text = "Alice Bob Alice Bob Alice Bob";
        String substr = "Alice";            
        StringBuffer strbuf = new StringBuffer(text);
        strbuf.indexOf(substr);
        strbuf.lastIndexOf(substr);
        while (strbuf != null) {
                strbuf.delete(strbuf.indexOf(substr), strbuf.indexOf(substr) + substr.length());
                System.out.println(strbuf.toString());
            }
}
我想删除所有出现的“Alice”。但它给出了以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
我认为错误在while行。
有什么想法吗?

因为如果
文本
不包含
substr
索引返回
-1
,您可以使用
-1
调用
删除

然后循环继续,直到strbuf
!=空
这是永远的

在您的情况下,当您删除所有出现的
substr
时,它会抛出一个异常,下一个
indexOf
返回
-1

用这种方式改变你的循环

int i;
while ((i = strbuf.indexOf(substr)) != -1)
    strbuf.delete(i, i + substr.length());

因为如果
文本
不包含
substr
,则
索引
返回
-1
,您可以使用
-1
调用
delete

然后循环继续,直到strbuf
!=空
这是永远的

在您的情况下,当您删除所有出现的
substr
时,它会抛出一个异常,下一个
indexOf
返回
-1

用这种方式改变你的循环

int i;
while ((i = strbuf.indexOf(substr)) != -1)
    strbuf.delete(i, i + substr.length());

您应该检查子字符串是否是字符串的一部分

int pos = strbuf.indexOf(substr);
if (pos < 0) { // not found...
应该有一个更好的版本

    String text = "Alice Bob Alice Bob Alice Bob";
    String substr = "Alice";            
    StringBuffer strbuf = new StringBuffer(text);
    while (true) {
      int pos = strbuf.indexOf(substr);
      if (pos < 0) break; // ready
      strbuf.delete(pos, pos + substr.length());
      System.out.println(strbuf.toString());
    }
String text=“Alice-Bob-Alice-Bob”;
字符串substr=“Alice”;
StringBuffer strbuf=新的StringBuffer(文本);
while(true){
int pos=strbuf.indexOf(substr);
如果(位置<0)中断;//准备就绪
strbuf.delete(pos,pos+substr.length());
System.out.println(strbuf.toString());
}

您应该检查子字符串是否是字符串的一部分

int pos = strbuf.indexOf(substr);
if (pos < 0) { // not found...
应该有一个更好的版本

    String text = "Alice Bob Alice Bob Alice Bob";
    String substr = "Alice";            
    StringBuffer strbuf = new StringBuffer(text);
    while (true) {
      int pos = strbuf.indexOf(substr);
      if (pos < 0) break; // ready
      strbuf.delete(pos, pos + substr.length());
      System.out.println(strbuf.toString());
    }
String text=“Alice-Bob-Alice-Bob”;
字符串substr=“Alice”;
StringBuffer strbuf=新的StringBuffer(文本);
while(true){
int pos=strbuf.indexOf(substr);
如果(位置<0)中断;//准备就绪
strbuf.delete(pos,pos+substr.length());
System.out.println(strbuf.toString());
}

您的问题是试图删除不存在的子字符串(在您删除了它的所有实例之后)。您必须将循环边界更改为

while(strbuf != null && strbuf.indexOf(substr) != -1)

您的问题是您试图删除不存在的子字符串(在您删除了它的所有实例之后)。您必须将循环边界更改为

while(strbuf != null && strbuf.indexOf(substr) != -1)

您得到的是-1,因为找不到该字符串,您需要更改条件以检查是否已首先找到该字符串,然后尝试将其删除

您得到的是-1,因为找不到该字符串,您需要更改条件以检查是否已首先找到该字符串,然后尝试删除它

这是因为一旦从stringbuffer中删除字符串“Alice”,您将无法再次找到它!!因此,您的indexOf()方法将返回-1,因此您将获得java.lang.StringIndexOutOfBoundsException,因为一旦您从stringbuffer中删除字符串“Alice”,您将无法再次找到它!!因此,您的indexOf()方法将返回-1,因此您将获得java.lang.StringIndexOutOfBoundsException

您是否考虑过只使用String#replaceAll(String old,String new”)?text.replaceAll(“Alice”,“new”)“
strbuf
何时将成为
null
?您的while循环将永远运行。您是否考虑过只使用String#replaceAll(String old,String new”)?text.replaceAll(“Alice”,即“”);
strbuf
何时将
null
?你的while循环将永远消失。