Java中如何将字符串中的所有\替换为\\?
我太懂你这种踩坑的感觉了——明明觉得是个简单的替换操作,结果一运行就报错,反斜杠这玩意儿在Java里确实是个让人头疼的角色。
为啥你的代码会报错?
你用的replaceAll()方法是基于正则表达式的,而正则里的反斜杠本身就是转义字符。你写的"\\"在Java字符串里其实只代表一个反斜杠,但正则引擎看到单个反斜杠会以为你要转义后面的字符,可这里后面啥都没有,自然就抛出PatternSyntaxException了。
给你几个靠谱的解决方法:
方法1:用replace()替代replaceAll()
replace()不需要正则表达式,它会直接替换所有匹配的字符序列,完全不用考虑转义的麻烦,代码清爽很多:
String strToReplace = oldString; strToReplace = strToReplace.replace("\\", "\\\\");
这里Java字符串里的"\\"对应实际的一个反斜杠,"\\\\"对应实际的两个反斜杠,刚好满足你的替换需求。
方法2:给replaceAll()做正确的双重转义
如果你一定要用replaceAll(),就得给正则和替换字符串都做足转义:要匹配一个反斜杠,正则里得写\\\\(因为Java字符串里每个反斜杠要写成\\,所以两个反斜杠就是\\\\);替换成两个反斜杠的话,替换字符串也要写成\\\\。代码是这样的:
String strToReplace = oldString; strToReplace = strToReplace.replaceAll("\\\\", "\\\\\\\\");
这样正则引擎就能正确识别要匹配的是单个反斜杠,然后替换成两个。
方法3:用Pattern.quote()简化正则匹配
要是觉得手动写一堆反斜杠太容易晕,可以用Pattern.quote()把要匹配的字符串转成正则安全的字面量,这样就不用手动转义了:
import java.util.regex.Pattern; String strToReplace = oldString; strToReplace = strToReplace.replaceAll(Pattern.quote("\\"), "\\\\\\\\");
Pattern.quote()会帮你把传入的字符串处理成正则里的纯字面量匹配,避免转义出错。
验证一下效果
假设你的oldString是从配置文件读来的"D:\\Work\\Project\\Data"(注意Java里写路径本身就要用双反斜杠),用上面任意一种方法处理后,得到的结果就是"D:\\\\Work\\\\Project\\\\Data",实际输出时会显示为D:\\Work\\Project\\Data,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Arnab Dhar

