replaceAll与replaceFirst的差异行为

时间:2015-11-22 21:22:28

标签: java regex

当我运行这些测试时

public class ReplacementTest {

    @Test
    public void testReplaceFirst() {

        Assert.assertEquals("123", "12003".replaceFirst("0*", ""));
    }

    @Test
    public void testReplaceAll() {

        Assert.assertEquals("123", "12003".replaceAll("0*", ""));
    }

}

testReplaceFirst失败但testReplaceAll次通过。为什么没有replaceFirst匹配" 00" in" 12003"?

1 个答案:

答案 0 :(得分:1)

您正在观察Matcher.find逻辑的细节。要理解它,请执行下一个代码:

"12003".replaceAll("0*", "x");

您将看到下一个输出:

x1x2xx3x

匹配器尝试在目标字符串中找到模式出现的第一个位置。考虑到零匹配也是匹配(根据您的模式),它匹配1之前的特定区域。虽然replaceAll将在下一个地区继续工作,但replaceFirst却不会。