Java replaceAll with []* - 找到所有字符(长度为9)但结果长度为2

yog*_*cak 0 java regex

我刚开始学习正则表达式并拥有以下代码:

 [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*
Run Code Online (Sandbox Code Playgroud)

我不明白*在这种情况下如何工作:

参考[3],我的理解是每个发现的角色都被一颗星代替,每个未发现的角色都被"一颗星+未发现的角色"所取代.

例如,字符串"chocolate"中的第一个char是c,所以用*替换它.第二个字符是h,它不是我们想要的,所以用*h保留它.我可以将此逻辑与[4]处的输出相匹配.

我的问题是为什么[2]会回归两颗星?

Usa*_*oto 5

星号*标记在RegEx中表示匹配前一个模式的"零或更多".

在你的case行[1]匹配整个字符串,然后匹配一个空字符串,因此**结果.

在行中,[3]每个匹配的一个或多个字母将匹配,但在每个匹配后,匹配一个空字符串.请参阅:https://regex101.com/r/sTmd9k/1