2013-04-22 93 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

希望它會幫助你。