【问题标题】:Java - escaping double quotes in string from fileJava - 从文件中转义字符串中的双引号
【发布时间】:2015-11-24 12:25:46
【问题描述】:

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

【问题讨论】:

标签: java regex


【解决方案1】:

我在 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);
}

【讨论】:

    【解决方案2】:

    使用Apache Commons Text- 更容易-

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

    输出:

    \"
    

    【讨论】:

      【解决方案3】:

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

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

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

      更多详情Java String#replaceAll documentation

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

      后来在Matcher.replaceAll 文档中:

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

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

      【讨论】:

        【解决方案4】:

        你需要做的:

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

        为什么会这样?

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

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          哪个输出:

          \"Hello world\"
          

          Demo

          【讨论】:

            猜你喜欢
            • 2013-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            相关资源
            最近更新 更多