![](/img/trans.png)
[英]Split a string in java based on white spaces escaping those spaces in double quotes and single quotes and that which are preceded by \
[英]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.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
方法,该方法也将“replaceAll”,但不会将您的参数解释为正则表达式:
@Test
public void testEscapeQuotes()
{
String content="some content with \"quotes\".";
content=content.replace("\"", "\\\"");
Assert.assertEquals("some content with \\\"quotes\\\".", content);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.