2017-07-17 84 views
0

我剛開始學習正則表達式,並有下面的代碼:的Java的replaceAll用[] * - 所有字符都被發現(9長度),但結果長度爲2

[1] String replace2 = "chocolate".replaceAll("[a-z]*","*"); 
[2] System.out.println(replace2);     //output: ** 
[3] replace2 = "chocolate".replaceAll("[a-c]*","*"); 
[4] System.out.println(replace2);     //output: **h*o**o*l**t*e* 

我不明白如何*作品在這種情況下:

參考[3],我的理解是,每一個被發現的字符被替換爲一顆星,每個unfound字符替換爲「一顆星+的unfound字符」

例如,字符串「巧克力」中的第一個字符是c,因此將其替換與*。第二個字符是h,它不是我們想要的,所以用* h保留它。我可以將此邏輯與[4]中的輸出相匹配。

我的問題是爲什麼[2]返回兩顆星?

+0

試試這個'字符串replace2 = 「巧克力」 .replaceAll( 「[AZ]」,「* 「);'! – Maraboc

+1

在[1]中,正則表達式匹配整個字符串(任意數量的字母),因此您只能獲得一顆星。 – assylias

+0

@Maraboc它可以很好地處理你的代碼,謝謝。但我試圖理解爲什麼當我使用「[a-z] *」時,輸出是這樣的嗎?「您能和我分享一下嗎? – yogescicak

回答

5

星號*標記表示在RegEx中,匹配上一個模式的「零個或多個」事件。

在您的案例行[1]匹配整個字符串,然後匹配一個空字符串,因此**結果。

在行[3]每個匹配的字母或字母將匹配,但每個匹配後的空字符串。請參閱:https://regex101.com/r/sTmd9k/1

+0

謝謝你糾正我對行[3]的理解。 – yogescicak

0

要獲得1星的使用+

String replace2 = "chocolate".replaceAll("[a-z]+","*"); 

使用*還會發現空字符串