2

我经常replace(CharSequence,CharSequence)在Java中使用该方法,但是今天遇到了一些我不太了解的东西。

当我做 :

"|||".replace("||","| |");

为什么它会导致:| ||而不是| | |?为什么第二个|不能包含在两个模式中?

为了解决我的问题,我必须写"|||".replace("||","| |").replace("||","| |");这看起来有点多余。

任何人都有解释来帮助我更好地理解背后的机制?

编辑

所以有人说这是javadoc中指定的特殊情况,但是错误的例子如下:

 * The replacement proceeds from the beginning of the string to the end, for
 * example, replacing "aa" with "b" in the string "aaa" will result in
 * "ba" rather than "ab".

所以它与我的情况不同,因为结果“ba”不再匹配“aa”。而在我的情况下,结果“| ||” 仍然包含模式。

4

5 回答 5

3

这里有两件事可能会导致混乱。首先,replace不会对同一个字符进行两次处理,所以中间|只能适用于单次替换。其次,replace 不处理替换字符,所以在第一次替换后你会有| ||,但第二次|是第一次替换的一部分。

所以基本上你得到的是在一次替换之后,你有第一个||被替换,其余的是|不匹配的,所以替换完成了。

于 2012-05-03T14:29:25.447 回答
1

不是真正的原因的答案,但这是一件好事

"|||".replace("||","| |");

不会导致"| | |". 如果结果是这样,这意味着替换也在已经发生替换的字符串的一部分上执行。这将使编写无限循环变得非常容易,例如"|".replace("|", "||" );会导致"||||||...."直到您的字符串变得如此之大以至于内存不足

于 2012-05-03T15:24:20.907 回答
1

替换首先查看要在原始字符串中找到的字符序列,一旦找到,它会说,好的匹配开始start并结束于,让我们用替换替换该部分,然后继续从该位置end寻找下一个匹配end + 1

于 2012-05-03T14:30:13.653 回答
1

replace()为什么会按照您期望的方式运行,有两种可能性:

  1. 它可以考虑重叠匹配(在您的示例中:匹配字符 1 和 2,然后是 2 和 3)。它不这样做。

  2. 它可以递归替换,这意味着由于替换而添加/更改的内容将有资格进行进一步的匹配。它也不这样做。

于 2012-05-03T14:28:26.140 回答
0

你正在寻找的是

"|||".replace("|","| "); 

或者

"|||".replace("|","| ").trim();

如果你不想要最后一个空间。

为什么我让你自学。提示:搜索正则表达式替换。

于 2012-05-03T14:34:24.177 回答