【问题标题】:Java replaceAll() method to escape special charactersJava replaceAll() 方法转义特殊字符
【发布时间】:2013-08-12 09:32:30
【问题描述】:

我正在使用 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


【解决方案1】:

你必须一个接一个,因为换行符 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 代码中的字符串完全一样,但它也会显示其他转义序列(如 \\\" 等)。 但也许这正是你想要的

【讨论】:

  • 为什么我们不能使用正则表达式?
  • 因为你无法匹配\nn,因为\n中没有n
  • /\n/这样的正则表达式文字在Java中无效
  • 我不知何故想到了 javascript :D
  • 另外你需要在替换中使用四个反斜杠。
【解决方案3】:

困难的方式:使用 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

【讨论】:

  • 循环完成后您忘记调用matcher.appendTail(result);。此外,matcher.group() 返回匹配的文本部分,因此您不必使用substring 方法。
【解决方案4】:

为什么不使用Matcher.quoteReplacement(stringToBeReplaced);

【讨论】:

    【解决方案5】:

    这是一个\ 问题,简化如下:

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

    输出:

    ddnfa    dnfadsf '  t  
    

    【讨论】:

    • 我想要完全相同的输出:"ddnfa \n \r \tdnfadsf ' \r t ".
    • 实际上我是从用户那里获取评论输入,所以我无法控制它,用户出于自己的目的将其写为评论,所以我无法修改它
    • @AbhishekGoel 你可以删除它,指出你的评论并点击红十字:)
    【解决方案6】:

    试试这个..

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

    【讨论】:

    • 新字符串与 \n 或 \r 与转义相同,即 \\n \\r,我的问题是如何将其更改为?
    • 您需要将\n 和\r 替换为\n 和\r???所有的 \n \r \t 都可以用 \n 代替吗??它会满足您的要求吗?
    • 实际上我是从用户那里获取评论输入,所以我无法控制它,用户出于自己的目的将其写为评论,所以我无法修改它
    • 好吧,我猜,你可以把所有的 \n \r 替换为 \n??!!
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2018-08-31
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多