Bootstrap

String中方法replace与replaceAll的区别详解

问题

最近在查线上问题的时候,发现日志里面挺多这种PatternSyntaxException错误的。从日志中可以清楚的知道,出问题的地方就是调用了String的replaceAll方法。等等,这个不就是个普通的替换方法嘛?难道是我用的姿势不对?话不多说,赶紧看一波源码,将bug修复
在这里插入图片描述

原因分析以及解决方案

在大多数人的认知里,replace方法是替换符合的单个字符串,而replaceAll是替换所有符合的字符串。瞄了一下源码,真的打脸了。

源码分析
 /**
     * Replaces each substring of this string that matches the literal target
     * sequence with the specified literal replacement sequence. The
     * replacement proceeds from the beginning of the string to the end, for
     * example, replacing "aa" with "b" in the string "aaa" will result in
     * "ba" rather than "ab".
      翻译:用指定的文字序列替换与目标文字序列中匹配的每个子字符串
     */
    public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
                this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
    }


    /**
     * Replaces each substring of this string that matches the given <a
     * href="../util/regex/Pattern.html#sum">regular expression</a> with the
     * given replac

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;