替换为空字符串替换原始字符串中所有字符周围的newChar

时间:2015-11-27 15:18:33

标签: java string replace

我正在处理我正在使用Java String.replace方法的一个java代码。因此,在一种情况下测试替换方法时,我计划将垃圾值设为String.replace("","");

所以在测试中,我遇到了用其他值替换空值的条件,即String.replace("","p")在原始字符串的所有字符周围替换了"p"

示例:

String strSample = "val";
strSample = strSample.replace("","p");
System.out.println(strSample);

输出:

pvpaplp

任何人都可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:5)

replace查找您拥有以替换字符串开头的String的每个位置。例如如果你在“香蕉”中替换“a”,它会发现“a”3次。

但是,对于空字符串,它会在任何地方找到它,包括在最后一个字母之前和之后。

答案 1 :(得分:1)

以下是Java文档中针对您的案例的重载replace方法的定义。

  

String java.lang.String.replace(CharSequence target ,CharSequence   的替换

     

替换此字符串中与文字目标匹配的每个子字符串   具有指定文字替换序列的序列。该   替换从字符串的开头到结尾,为   例如,替换" aa"用" b"在字符串" aaa"会导致   " BA"而不是" ab"。

     

参数:
  目标要替换的char值序列
  替换 char值的替换序列

现在,由于您将target值定义为"",即为空,因此它会选择字符串中的每个位置,并将其替换为replacement中定义的值。

值得注意的是,如果您使用strSample = strSample.replace(" ","p");这意味着一个空格字符为target值,则不会替换任何内容,因为现在在这种情况下replace方法将会尝试搜索空格字符。

答案 2 :(得分:1)

本机Java java.lang.String实现(如Ruby和Python)在执行字符串操作时将空字符串""视为有效字符序列。因此,""字符序列在两个字符之间实际上无处不在,包括在最后一个字符之前和之后。

它与所有java.lang.String操作协调一致。见:

String abc = "abc";
System.out.println(abc.replace("", "a"));  // aaabaca instead of "abc"
System.out.println(abc.indexOf("", "a"));  // 0 instead of -1
System.out.println(abc.contains("", "a")); // true instead of false

作为旁注:

这种行为可能会产生误导,因为许多其他语言/实现的行为都不像这样。例如,SQL(MySQL,MSSQL,Oracle和PostgreSQL)和PHP不会将""视为字符串替换的有效字符序列。 .NET进一步调用System.ArgumentException: String cannot be of zero length.,例如调用abc.Replace("", "a")

即使是流行的Apache Commons Lang Java库也有不同的工作方式:

org.apache.commons.lang3.StringUtils.replace("abc", "", "a")); /* abc */

答案 3 :(得分:0)

看一下这个例子:

"" + "abc" + ""

此代码的结果是什么?
答:它仍然是"abc"。所以你看,我们可以说所有字符串前后都有一些空字符串。

同样的规则适用于

之类的字符
"a"+""+"b"+""+"c"

仍会创建"abc"

字符之间也存在空字符串。

在您的代码中

"val".replace("","p")

所有这些空字符串都替换为p,导致pvpaplp

如果""+""+..+""+""假设Java足够聪明,可以将其视为一个""