背景:要用$0和$9替换字符串中的\0和\9,但要考虑\被转义的情况。例如,\\9不能被替换。.方法一先把\\替换成不可能的字符:staticvoidmain(String[]args){Stringstr="\\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("不替换","\\\\\\\\"));}非替换可以根据实际场景改为其他不可能的字符。方法二是纯正则方法:publicstaticvoidmain(String[]args){Stringstr="\\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。
