我有来自文件的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("\"","\\\"");
不起作用?
答案 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\"
答案 2 :(得分:1)
你需要这样做:
icons
为什么这会起作用?
String content = "some content with \" quotes.";
content = content.replaceAll("\"", "\\\\\"");
代表\"
符号,而您需要"
。
如果您添加\"
作为前缀(\
),那么您也必须转义前缀,即您将拥有\\"
。现在,这将代表\\\"
,其中\"
不是转义字符,而是符号\
。
但是在Java字符串中,\
字符将使用"
进行转义,您也必须将其替换。因此,再次使用\
添加前缀会很好:
\\
答案 3 :(得分:0)
在Java中花了太长时间才发现Pattern.quote
和Matcher.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)