Java的replaceAll()方法转义特殊字符

问题描述 投票:0回答:7

我正在使用java

replaceAll()
方法来转义换行符

String comment = "ddnfa \n  \r \tdnfadsf ' \r t  ";
comment = comment.replaceAll("(\\n|\\r|\\t)","\\\\$1");
System.out.println(comment);

但是上面的代码仍然是插入新行。

有没有办法输出完全相同的注释(即使用

\n
\r
而不是插入新行)?

更新:

我最终使用了:

comment = comment.replaceAll("\\n","\\\\n")
                 .replaceAll("\\r","\\\\r")
                 .replaceAll("\\t","\\\\t");
java regex replaceall
7个回答
4
投票

您必须逐一进行,因为换行符 U+000A 与两个字符转义序列无关

\n
:

comment = comment.replaceAll("\n","\\\\n");
comment = comment.replaceAll("\r","\\\\r");
comment = comment.replaceAll("\t","\\\\t");

2
投票

你必须逐个字符地做:

comment = comment.replaceAll("\n","\\\\n");
comment = comment.replaceAll("\r","\\\\r");
comment = comment.replaceAll("\t","\\\\t");

另一个解决方案是使用此函数将字符串转义为 Java 字符串:

comment = org.apache.commons.lang.StringEscapeUtils.escapeJava(comment);

这将使字符串看起来与 Java 代码中的字符串完全相同,但它还会显示其他转义序列(如

\\
\"
等)。 但也许这正是你想要的


1
投票

困难的方法:使用 Matcher

String comment = "ddnfa \n  \r \tdnfadsf ' \r t  ";

Map<String,String> sub = new HashMap<String,String>();
sub.put("\n", "\\\\n");
sub.put("\r", "\\\\r");
sub.put("\t", "\\\\t");

StringBuffer result = new StringBuffer();
Pattern regex = Pattern.compile("\\n|\\r|\\t");
Matcher matcher = regex.matcher(comment);
while (matcher.find()) {
    matcher.appendReplacement(result, sub.get(matcher.group()));
}
matcher.appendTail(result);

System.out.println(result.toString());

打印

ddnfa \n  \r \tdnfadsf ' \r

1
投票

为什么你不使用

Matcher.quoteReplacement(stringToBeReplaced);


0
投票

这是一个

\
问题,像这样简化:

comment = comment.replaceAll("(\n|\r|\t)", "");

输出:

ddnfa    dnfadsf '  t  

0
投票

试试这个..

comment.replaceAll("(\n)|(\r)|(\t)", "\n");

0
投票

使用

String#replace
避免替换字符序列中所需的双重转义:

comment = comment.replace("\\n","\\n")
                 .replace("\\r","\\r")
                 .replace("\\t","\\t");

"\n"
是包含单个字符的字符串:换行符。
"\\n"
是包含两个字符的字符串:反斜杠和字母 n。)

© www.soinside.com 2019 - 2024. All rights reserved.