繁体   English   中英

Java中替换方法的说明

[英]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. 它可以考虑重叠的匹配项(在您的示例中:匹配字符1和2,然后匹配2和3)。 它不会那样做。

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

替换通过查看要在原始字符串中找到的字符序列开始,一旦找到,它说,确定匹配start ,到end ,让我们用替换替换该部分,然后继续从中寻找下一个匹配项。 end + 1位置

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

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

不会导致"| | |" 如果是这样的结果,则意味着还对已经进行替换的String的一部分执行替换。 这将使编写无限循环变得非常容易,例如"|".replace("|", "||" ); 会导致"||||||...."直到您的字符串变大而导致内存不足

您正在寻找的是

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

要么

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM