Java中反斜杠需写两个因编译器和JVM双重转义;单个\非法,"\\"存为一个\;正则匹配\需"\\\";仅支持标准ASCII转义序列,Unicode转义\uXXXX仅编译期有效。

Java字符串里反斜杠为什么必须写两个
因为Java编译器在解析字符串字面量时,会先处理一次转义,而JVM运行时又按Unicode规则再解释一次。单个 \ 会被当成转义起始符,但后面若没有合法转义字符(如 n、t、"),就会报错 illegal escape character。
所以你想表示一个真实反斜杠(比如Windows路径 C:\Users\name),必须写成 "C:\\Users\\name"——第一个 \ 转义第二个 \,最终字符串里才存着一个 \。
-
"\\"→ 字符串内容是单个\ -
"\\\t"→ 字符串内容是\+ 制表符(因为\\得到\,\t得到制表符) -
正则表达式中更麻烦:匹配一个字面量
\,得写"\\\\ "(编译器吃掉两对,剩下一对给Pattern用)
常见转义序列哪些能直接用,哪些会出问题
Java支持的标准转义序列不多,且全部是ASCII级的。像 \u00E9(é)这种Unicode转义是在编译期就解析的,不属于运行时字符串转义;而 \x41 这种十六进制形式根本不存在,会直接编译失败。
能安全使用的只有:
立即学习“Java免费学习笔记(深入)”;
-
"\n"(换行)、"\r"(回车)、"\t"(制表)、"\b"(退格)、"\f"(换页) -
"\""(双引号)、"\'"(单引号)、"\\"(反斜杠) -
"\uXXXX"(Unicode转义,仅限编译期,不能拼接变量)
下面这些写法全是错的:
-
"\v"(垂直制表符:Java不支持,编译报错) -
"\0"(空字符:虽然能编译,但容易被忽略或导致IO异常) -
"\x61"(非法转义,编译失败)
从用户输入或文件读取含转义的字符串怎么办
Java不会自动把字符串里的 "\n"(即两个字符:反斜杠 + n)变成换行符。那是文本内容,不是语法转义。如果你读到一行文本是 "Hello\nWorld",它长度是12,不是11——里面真真切切存着 \ 和 n 两个字符。
要还原成“语义化”字符串(比如把 "\\n" 变成 '\n'),得手动处理:
public static String unescape(String s) {
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\r", "\r")
.replace("\\\"", "\"")
.replace("\\\\", "\\");
}注意顺序:"\\\\" 必须最后替换,否则前面的替换可能干扰它;如果需求复杂(比如支持 \u),建议用Apache Commons Text的 StringEscapeUtils.unescapeJava()。
JSON或日志中输出字符串时要不要手动转义
不用。只要用标准库,比如 ObjectMapper.writeValueAsString() 或 java.util.logging,它们内部已按目标格式规则做转义。你传入 "A\nB",JSON输出就是 "A\\nB",日志里显示为换行——这是序列化层的责任,不是你的字符串该操心的。
唯一要警惕的是拼接SQL或HTML时自己手写引号和转义:
- 用
PreparedStatement,别用"SELECT * FROM t WHERE name = '" + name + "'" - 向HTML输出用户数据时,用
StringEscapeUtils.escapeHtml4(),而不是自己 replace"&"和"
手动转义极易遗漏边界情况,比如空字符、高位Unicode、代理对。交给专有工具更稳。










