繁体   English   中英

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

[英]Java - escaping double quotes in string from file

我有来自文件的 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("\\"","\\\\\\""); 不起作用?

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

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

在这里, \\\\\\\\表示文字\\\\"表示文字"

Java String#replaceAll文档中的更多详细信息:

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

后来在Matcher.replaceAll文档中:

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

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

你需要做:

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

为什么这会起作用?

\\"代表"符号,而您需要\\"

如果您添加\\作为前缀( \\\\" ),那么您也必须转义前缀,即您将有一个\\\\\\" 这现在将代表\\" ,其中\\不是转义字符,而是符号\\

但是,在 Java 字符串中, "字符将用\\转义,您也必须替换它。因此,再次使用\\\\作为前缀就可以了:

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

老实说,我对这种行为感到惊讶,但似乎您需要双重转义反斜杠:

System.out.println("\"Hello world\"".replaceAll("\"", "\\\\\""));

输出:

\"Hello world\"

演示

我在 Java 中花了很长时间才发现Pattern.quoteMatcher.quoteReplacement 这些将你实现你在这里尝试做的事情——这是一个简单的“查找”和“替换”——没有任何正则表达式和转义逻辑。 此处的Pattern.quote不是必需的,但它显示了如何确保“查找”部分不被解释为正则表达式字符串:

@Test
public void testEscapeQuotes()
{
    String content="some content with \"quotes\".";
    content=content.replaceAll(Pattern.quote("\""), Matcher.quoteReplacement("\\\""));
    Assert.assertEquals("some content with \\\"quotes\\\".", content);
}

请记住,您还可以使用简单的.replace方法,该方法也将“replaceAll”,但不会将您的参数解释为正则表达式:

@Test
public void testEscapeQuotes()
{
    String content="some content with \"quotes\".";
    content=content.replace("\"", "\\\"");
    Assert.assertEquals("some content with \\\"quotes\\\".", content);
}

使用Apache Commons Text更容易 -

System.out.println(StringEscapeUtils.escapeJava("\""));

输出:

\"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM