Java - 从文件中转义字符串中的双引号

2022-09-04 01:43:40

我有来自文件的html字符串。我需要转义所有双引号。所以我这样做:

String content=readFile(file.getAbsolutePath(), StandardCharsets.UTF_8);
content=content.replaceAll("\"","\\\"");
System.out.println(content);

但是,双引号不会进行转义,并且字符串与 replaceAll 方法之前的字符串相同。当我这样做

String content=readFile(file.getAbsolutePath(), StandardCharsets.UTF_8);
content=content.replaceAll("\"","^^^");
System.out.println(content);

所有双引号均替换为 ^^^。

为什么不行?content.replaceAll("\"","\\\"");


答案 1

您需要使用 4 个反斜杠来表示替换模式中的一个文字反斜杠:

content=content.replaceAll("\"","\\\\\"");

在这里,表示一个字面意思,并表示一个字面意思。\\\\\\""

有关 Java String#replace 的所有文档的更多详细信息

请注意,替换字符串中的反斜杠 () 和美元符号 () 可能会导致结果与将其视为文字替换字符串时的结果不同;请参阅 Matcher.replaceAll\$

稍后在 Matcher.replaceAll 文档中:

如上所述,美元符号可以被视为对捕获的子序列的引用,反斜杠用于转义替换字符串中的文字字符。

另一个有趣的替代品是用美元符号替换引号:替换是 。对于正则表达式引擎,2 s 变成 1 个文本,它转义了用于定义反向引用的特殊字符。所以,现在它是替换模式中的文字。"\\$"\\$


答案 2

你需要做的:

String content = "some content with \" quotes.";
content = content.replaceAll("\"", "\\\\\"");

为什么会这样?

\"表示符号,而您需要 ."\"

如果将 a 添加为前缀 (),则还必须对前缀进行转义,即您将有一个 .这现在将表示 ,其中 不是转义字符,而是符号 。\\\"\\\"\"\\

但是,在Java字符串中,该字符将使用a进行转义,您还必须替换它。因此,再次以 前缀 为将可以:"\\\

x = x.replaceAll("\"", "\\\\\"");