背景:
要将字符串里的\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$0
,0\0
被替换成0$0
,其余的不替换。所以须要再replaceAll
一轮。