【问题标题】:Replacing a specific Char from a String between two positions从两个位置之间的字符串替换特定字符
【发布时间】:2020-02-03 14:39:06
【问题描述】:

考虑以下字符串:

String str = "XFB_PART~\XFB_IDF~\XFB_MODE~0\XFB_LOCALITEM~\XFB_REMOTEITEM~\XFB_MSG~tool\ soundgarden~\ASYNCHRONOUS~0\BROADCAST~0\XFB_LOCALAGT~"

我想做的是用逗号替换 XFB_MSGASYNCHRONOUS 之间的所有反斜杠(所以每次看到反斜杠时,都用逗号替换它)。

这就是我所做的:

            stringBuffer = new StringBuffer(str);


            for (int i = stringBuffer.indexOf("XFB_MSG"); i<stringBuffer.indexOf("ASYNCHRONOUS"); i++){

                if(stringBuffer.charAt(i)=='\\'){
                    stringBuffer = stringBuffer.replace(i, i, ",");
                }
            }

问题是,一旦满足条件if (stringBuffer.charAt(i)=='\\'),即使我更改值,编译器也会继续输入和替换字符,结果我得到一个不断插入逗号的无限循环:

XFB_PART~\XFB_IDF~\XFB_MODE~0\XFB_LOCALITEM~\XFB_REMOTEITEM~\XFB_MSG~tool,,,,,,,,\ soundgarden~\ASYNCHRONOUS~0\BROADCAST~0\XFB_LOCALAGT~

再一次,目标是只替换XFB_MSGASYNCHRONOUS 之间的所有反斜杠,并保持字符串的其余部分不变。位置可以改变,这两个参数之间的值也可以改变。所以我必须像那样搜索它们并尝试找到一种方法将它们之间的反斜杠替换为逗号。

知道为什么我会有一个无限循环,如果你碰巧有更好的方法来做到这一点,请随时告诉我。

谢谢。

【问题讨论】:

  • 您可能想使用String.replace。比如:int start = str.indexOf("XFB_MSG"); int end = str.indexOf("ASYNCHRONOUS"); str = str.substring(0, start) + str.substring(start, end).replace('\\', ',') + str.substring(end);
  • 谢谢。您的方法更好更简单,甚至不必使用 StringBuffer。

标签: java replace stringbuffer


【解决方案1】:

我变了:

stringBuffer = stringBuffer.replace(i, i, ",");

到:

stringBuffer = stringBuffer.replace(i, i+1, ",");

现在它可以工作了。

但我仍然不明白为什么它现在可以工作,为什么之前我有一个无限循环。

【讨论】:

  • 仔细阅读the method documentation
  • 结束索引是独占的,开始索引不是。因此,结束索引应该超出您尝试包含的索引。 substring 与它的索引有相似的细微差别,这在你使用它时是有道理的,但如果你有一段时间没有使用它就会变得更糟。
  • 感谢您的解释。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 2017-04-08
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
相关资源
最近更新 更多