用正则表达式“。*”替换字符串将返回替换两次

时间:2013-04-22 10:05:41

标签: java regex

鉴于此代码:

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

为什么replaced包含字符串HIHI而不是HI,因为我猜对了?似乎它与行的开头有关,因为使用模式^.*会产生HI,但我没有理由这样做。

4 个答案:

答案 0 :(得分:5)

查看replaceAll javadoc:将此字符串的每个子字符串替换为给定替换的给定正则表达式。 这匹配两个子串:“”和“A”。 您可以通过测试

来看到这一点
String replaced = "".replaceAll( ".*", "HI" );

导致单个“HI”被打印

答案 1 :(得分:5)

认为这是因为.*首先匹配整个字符串,然后匹配字符串末尾的空字符串。当然,^.*与“A”末尾的空字符串不匹配,因此最终只有一个“HI”。

答案 2 :(得分:0)

Matcher类的find方法在“A”之后找到“A”和空字符串,因此有2个替换。

答案 3 :(得分:0)

replaceAll方法将regex和replacement参数视为(read more): -

public String replaceAll(String regex,
                         String replacement)

在此示例中,.*表示正则表达式。

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

*表示零次或多次(Read More regexp

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

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

输出: - HIHI

希望它会对你有所帮助。