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

时间:2015-11-24 12:25:47

标签: java regex

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

5 个答案:

答案 0 :(得分:5)

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

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

此处,\\\\表示文字\\"表示文字"

Java String#replaceAll documentation的更多详情:

  

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

稍后在Matcher.replaceAll文档:

  

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

另一个有趣的替代品是replacing quotes with dollar sign:替换为"\\$"。对于正则表达式引擎,2 \转为1个文字\,它会转义用于定义反向引用的特殊字符$。所以,现在它是替换模式中的文字。

答案 1 :(得分:1)

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

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

输出:

\"Hello world\"

Demo

答案 2 :(得分:1)

你需要这样做:

icons

为什么这会起作用?

String content = "some content with \" quotes."; content = content.replaceAll("\"", "\\\\\""); 代表\"符号,而您需要"

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

但是在Java字符串中,\字符将使用"进行转义,您也必须将其替换。因此,再次使用\添加前缀会很好:

\\

答案 3 :(得分:0)

在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方法,该方法也会“替换”,但不会将您的参数解释为正则表达式:

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

答案 4 :(得分:0)

使用Apache Commons Text-

更轻松
\"

输出:

{{1}}