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)
所以我对三件事感到困惑.
对不起,如果我在问题的任何部分出错了.
只需在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)
和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之间的匹配.
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |