乐趣区

关于java:小知识java字符串正则替换

背景:

要将字符串里的 \0\9替换成 $0$9,然而要思考 \ 被本义的状况,比方 \\9 是不能被替换的。

形式一

先将 \\ 替换成不可能呈现的字符:

    static void main(String[] args) {
        String str = "\\0\\0\\\\0\\9\\0abcdefg\\\\9abc\\0\\\\\\0\\9\\\\\\9";
        System.out.println(str);
        System.out.println(str.replaceAll("\\\\\\\\(0|9)", "不替换 $1")
                .replaceAll("\\\\(0|9)", "\\$$1")
                .replaceAll("不替换", "\\\\\\\\"));
    }

其中 不替换 能够依据理论场景,改为其余 不可能呈现的字符

形式二

纯正则的形式:

    public static void main(String[] args) {
        String str = "\\0\\0\\\\0\\9\\0ab\\cdefg\\\\9abc\\0\\\\\\0\\0\\9\\\\\\9";
        System.out.println(str);
        System.out.println(str.replaceFirst("^\\\\(0|9)", "\\$$1")
                .replaceAll("([^\\\\])\\\\(0|9)", "$1\\$$2")
                // 必须两轮
                .replaceAll("([^\\\\])\\\\(0|9)", "$1\\$$2"));
    }

其中:

  • 应用 非 \ + \ + 0|9的形式,来排除掉 \\0|9 这种场景。
  • 下面的计划,因为靠 \ 前是否还有 \ 的形式来判断,所以要解决结尾就是 \0 的场景。
  • 必须两轮replaceAll,否则会呈现以下后果:
a\0\0\0\0\0\0

被替换成

a$0\0$0\0$0\0

因为 java 按正则规定,把字符串依据 适配合乎规定的串 打散成以下几个串:a\0 + \ + 0\0 + \ + 0\0 + \0,其中 a\0 被替换成 a$00\0 被替换成 0$0,其余的不替换。所以须要再replaceAll 一轮。

退出移动版