为什么replaceFirst和replaceAll给出不同的结果?

Rea*_*lar 9 java regex

以下代码将str设置为"testss"

String str = "test".replaceAll("(.*)$","$1s");
Run Code Online (Sandbox Code Playgroud)

以下代码将其设置为"tests"

String str = "test".replaceFirst("(.*)$","$1s");
Run Code Online (Sandbox Code Playgroud)

我本以为这两个操作都会产生相同的结果.有人可以解释为什么replaceAll会在字符串的末尾添加额外的s?

Mat*_*ell 5

这是因为"(.*)$"从中捕获了两个字符串"test","test"以及空字符串("").所以replaceAll会加两个"s".