7

鉴于此代码:

String replaced = "A".replaceAll(".*", "HI");

为什么replaced包含字符串HIHI而不是HI我猜的?^.*自从使用模式yield以来,它似乎与行首有关HI,但我不明白这是为什么。

4

4 回答 4

5

查看replaceAll javadoc:用给定的替换替换这个字符串中与给定正则表达式匹配的每个子字符串。这匹配两个子字符串:“”和“A”。你可以通过测试看到这一点

String replaced = "".replaceAll( ".*", "HI" );

这会导致打印单个“HI”

于 2013-04-22T10:12:31.037 回答
5

认为这是因为.*首先匹配整个字符串,然后匹配字符串末尾的空字符串。当然,^.*不会匹配 "A" 末尾的空字符串,所以你最终只有一个 "HI"。

于 2013-04-22T10:18:22.553 回答
0

Matcher类的find方法找到“A”和“A”后面的一个空String,所以有2个替换。

于 2013-04-22T10:31:45.573 回答
0

replaceAll方法采用正则表达式和替换参数(阅读更多):-

public String replaceAll(String regex,
                         String replacement)

在这个例子.*中代表正则表达式。

.表示任何字符(可能匹配也可能不匹配行终止符)

*表示零次或多次(阅读更多正则表达式

您给定代码的输出是正确的。正则表达式与* 均值匹配零次或多次。它会影响结果。

String replaced = "A".replaceAll(".*", "HI");

输出:- HIHI

希望它会帮助你。

于 2013-04-22T11:01:08.140 回答