2013-04-22 61 views
7

鉴于此代码:替换字符串正则表达式返回更换两次

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

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

+0

您可以使用'。+'来防止匹配空字符串('“”')。 – brimborium 2013-04-22 10:47:30

回答

5

看到这个我认为这是因为.*首先整个字符串相匹配,然后在匹配空字符串字符串的结尾。当然,^.*将不匹配“A”末尾的空字符串,所以最终只有一个“HI”。

5

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

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

导致一个“HI”正在被打印

+2

在“A”中有两个位置(可以这么说的字母之间):0和1.在0“A”匹配时,在1“”匹配。 – 2013-04-22 10:18:57

+0

@JoopEggen无论如何,这是违反直觉的。如果'。*'是贪婪的,它应该“吃”整个字符串**,包括最后的空字符串并返回匹配一次。 – 2013-04-22 10:29:57

+0

两个空字符串'“A”.replaceAll(“”,“HI”)== HIAHI' – Kent 2013-04-22 10:30:38

0

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

0

replaceAll方法采用正则表达式和替换参数像(read more): -

public String replaceAll(String regex, 
         String replacement) 

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

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

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

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

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

输出: - HIHI

希望它会帮助你。