非空字符串中的空字符串

Aru*_*ran 13 java arrays string char

我对代码感到困惑

public class StringReplaceWithEmptyString 
{
    public static void main(String[] args) 
    {
        String s1 = "asdfgh";
        System.out.println(s1);
        s1 = s1.replace("", "1");
        System.out.println(s1); 
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

asdfgh
1a1s1d1f1g1h1
Run Code Online (Sandbox Code Playgroud)

所以我的第一个意见是String中的每个字符都在""两边都有一个空字符串.但是,如果是'a'(在字符串中)之后就应该有两个'1'输入(第一行为'a',第二行为's').

现在我检查了String是否在这些链接中表示为char [] 在Java中,是一个字符串数组?在Java中字符串表示我得到的答案是YES.

于是,我就一个空字符分配''给一个char变量,但它给我一个编译器错误,

字符常量无效

我尝试时,同样的过程给出了编译器错误 char[]

char[] c = {'','a','','s'};  // CTE
Run Code Online (Sandbox Code Playgroud)

所以我对三件事感到困惑.

  1. char []如何表示空字符串?
  2. 为什么我得到上述代码的输出?
  3. 首次初始化时,字符串s1如何在char []中表示?

对不起,如果我在问题的任何部分出错了.

Avi*_*ash 7

只需在Tim Biegeleisen的答案中添加更多解释.

从Java 8开始,replacejava.lang.String类中的方法代码是

public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
                this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
Run Code Online (Sandbox Code Playgroud)

在这里您可以清楚地看到字符串被正则表达式模式匹配器替换,而正则表达式""由零长度字符标识,并且它存在于任何非零长度字符周围.

因此,在场景后面,您的代码执行如下

Pattern.compile("".toString(), Pattern.LITERAL).matcher("asdfgh").replaceAll(Matcher.quoteReplacement("1".toString()));
Run Code Online (Sandbox Code Playgroud)

输出变成了

1a1s1d1f1g1h1
Run Code Online (Sandbox Code Playgroud)


Tim*_*sen 6

和Andy Turner一起发表评论,你的电话String#replace()实际上是用来实现的String#replaceAll().因此,这里发生了正则表达式替换.匹配发生在第一个字符之前,字符串中每个字符之间以及最后一个字符之后.

^|a|s|d|f|g|h|$
 ^ this and every pipe matches to empty string ""
Run Code Online (Sandbox Code Playgroud)

您正在进行的匹配是零长度匹配.在Java的正则表达式实现中String.replaceAll(),这表现为上面的例子,即匹配每个字符间位置和第一个字符之前和之后的位置.

以下是更详细地讨论零长度匹配的参考:http://www.regexguru.com/2008/04/watch-out-for-zero-length-matches/

零宽度或零长度匹配是与任何字符都不匹配的正则表达式匹配.它仅匹配字符串中的位置.例如,正则表达式\ b匹配1和1,2之间的匹配.

  • @SantiBailors是的,这也是我的想法.Google的Java架构师Andy Turner似乎认为`replaceAll`正在被引用.在任何情况下,行为都是零长度正则表达式替换. (2认同)
  • `^ $`表示_entire_字符串中没有任何内容,因此只有空字符串匹配.搜索`""`unbounded意味着找到字符串中每个字符之间的边界.说得通? (2认同)

归档时间:

查看次数:

853 次

最近记录:

9 年,1 月 前