我经常在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”的匹配。而在我的情况下,结果“|||”仍然包含模式。
答案 0 :(得分:3)
这里有两件事可能导致混乱。首先,replace
不会处理相同的字符两次,因此中间|
只能应用于单个替换。其次,替换不处理替换字符,因此在第一次替换后您将获得| ||
,但第二次|
是第一次替换的一部分。
所以基本上你得到的是一次替换之后,你有第一个||
被替换,其余的是|
,它们不匹配,所以替换完成了。
答案 1 :(得分:1)
为什么replace()
可能会按照您期望的方式行事,有两种可能:
可以考虑重叠匹配(在您的示例中:匹配字符1和2,然后是2& 3)。它没有这样做。
它可以递归替换,这意味着由于替换而添加/更改的内容将有资格进行进一步的匹配。它也不会这样做。
答案 2 :(得分:1)
替换首先查看在原始字符串中查找的字符序列,一旦找到,就说好了,匹配从start
开始到end
结束,让我们用替换替换该部分然后继续寻找end + 1
位置
答案 3 :(得分:1)
对于原因并不是真正的答案,但这是一件好事
"|||".replace("||","| |");
不会导致"| | |"
。如果这是结果,则意味着替换也在已经发生替换的String的一部分上执行。
这样就可以很容易地编写一个无限循环,例如"|".replace("|", "||" );
会导致"||||||...."
,直到您的字符串变得如此之大以至于内存不足
答案 4 :(得分:0)
您正在寻找的是
"|||".replace("|","| ");
或
"|||".replace("|","| ").trim();
如果你不想要最后一个空格。
为什么我让你自学。提示:搜索正则表达式替换。