鑑於此代碼:替換字符串正則表達式返回更換兩次
String replaced = "A".replaceAll(".*", "HI");
爲什麼replaced
包含字符串HIHI
而不是HI
因爲我早就猜到了?看起來它與一行的開頭有關,因爲使用^.*
的模式產生HI
,但我沒有理由這樣做。
鑑於此代碼:替換字符串正則表達式返回更換兩次
String replaced = "A".replaceAll(".*", "HI");
爲什麼replaced
包含字符串HIHI
而不是HI
因爲我早就猜到了?看起來它與一行的開頭有關,因爲使用^.*
的模式產生HI
,但我沒有理由這樣做。
看到這個我認爲這是因爲.*
首先整個字符串相匹配,然後在匹配空字符串字符串的結尾。當然,^.*
將不匹配「A」末尾的空字符串,所以最終只有一個「HI」。
查看replaceAll javadoc:將此字符串的每個子字符串替換爲給定替換的給定正則表達式。 這匹配兩個子字符串:「」和「A」。 您可以通過測試
String replaced = "".replaceAll(".*", "HI");
導致一個「HI」正在被打印
在「A」中有兩個位置(可以這麼說的字母之間):0和1.在0「A」匹配時,在1「」匹配。 – 2013-04-22 10:18:57
@JoopEggen無論如何,這是違反直覺的。如果'。*'是貪婪的,它應該「吃」整個字符串**,包括最後的空字符串並返回匹配一次。 – 2013-04-22 10:29:57
兩個空字符串'「A」.replaceAll(「」,「HI」)== HIAHI' – Kent 2013-04-22 10:30:38
Matcher類的find方法在「A」之後找到「A」和一個空字符串,所以有2個替換。
的replaceAll
方法採用正則表達式和替換參數像(read more): -
public String replaceAll(String regex,
String replacement)
在這個例子中.*
表示正則表達式。
.
表示任何字符(可能或可能不匹配行終止)
*
表示零次或多次(Read More regexp)
您的給定代碼的輸出是正確的。正則表達式匹配*
意味着零次或多次。它影響結果。
String replaced = "A".replaceAll(".*", "HI");
輸出: - HIHI
希望它會幫助你。
您可以使用'。+'來防止匹配空字符串('「」')。 – brimborium 2013-04-22 10:47:30