Java中替换方法的说明

时间:2012-05-03 14:24:27

标签: java

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

当我这样做时:

"|||".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”的匹配。而在我的情况下,结果“|||”仍然包含模式。

5 个答案:

答案 0 :(得分:3)

这里有两件事可能导致混乱。首先,replace不会处理相同的字符两次,因此中间|只能应用于单个替换。其次,替换不处理替换字符,因此在第一次替换后您将获得| ||,但第二次|是第一次替换的一部分。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

的下一场比赛

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

您正在寻找的是

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

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

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

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