[英]Explanation of replace method in 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”匹配。 而在我看来,结果是“ | ||” 仍然包含模式。
这里有两件事可能引起混乱。 首先, replace
不会两次处理相同的字符,因此中间|
只能应用于单个替换。 其次,replace不处理替换字符,因此在第一次替换之后,您将| ||
| ||
,但是第二个|
是第一次替换的一部分。
因此,基本上您得到的是一个替换之后,您有了第一个||
被替换,其余为|
不匹配,因此替换完成。
为什么replace()
可能会按照您期望的方式运行,有两种可能性:
它可以考虑重叠的匹配项(在您的示例中:匹配字符1和2,然后匹配2和3)。 它不会那样做。
它可以递归替换,这意味着由于替换而添加/更改的内容将有资格进行进一步的匹配。 它也不这样做。
替换通过查看要在原始字符串中找到的字符序列开始,一旦找到,它说,确定匹配start
,到end
,让我们用替换替换该部分,然后继续从中寻找下一个匹配项。 end + 1
位置
并不是关于原因的答案,但这是一件好事
"|||".replace("||","| |");
不会导致"| | |"
。 如果是这样的结果,则意味着还对已经进行替换的String的一部分执行替换。 这将使编写无限循环变得非常容易,例如"|".replace("|", "||" );
会导致"||||||...."
直到您的字符串变大而导致内存不足
您正在寻找的是
"|||".replace("|","| ");
要么
"|||".replace("|","| ").trim();
如果您不想要最后一个空格。
我为什么让你自学。 提示:搜索正则表达式替换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.