【问题标题】:Forcing newline to print correctly again强制换行再次正确打印
【发布时间】:2014-02-08 02:05:55
【问题描述】:

我必须将一堆字符串导出到我在 excel 中打开的 CSV。字符串包含我需要包含在 CSV 中的 '\n' 和 '\t' 所以我在导出数据之前做了以下操作:

public static String unEscapString(String s)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++)
    {
        switch (s.charAt(i))
        {
            case '\n': sb.append("\\n"); break;
            case '\t': sb.append("\\t"); break;
            default: sb.append(s.charAt(i));
        }
    }
    return sb.toString();
}

问题是我现在正在将数据重新导入 Java,但我不知道如何让换行符和制表符再次正确打印。我试过了:

s.replaceAll("\\n", "\n");

但它仍然忽略换行符。帮忙?

编辑:我正在尝试做的示例:

假设 CSV 中的一个字符串是“foo \n bar”。当我使用 Java 导入它并尝试将相同的字符串打印到控制台但换行符正确运行时

【问题讨论】:

  • 你能提供一个样本sreplace的结果吗?
  • 用一个例子编辑了操作

标签: java regex newline


【解决方案1】:

replaceAll 的第一个参数是一个正则表达式。你有2个选择。您可以像这样使用普通的旧replace

s.replace("\\n", "\n");

或者您可以转义正则表达式解析器的斜杠(即剥离单个斜杠):

s.replaceAll("\\\\n", "\n");

s.replaceAll(Pattern.quote("\\n"), "\n");

我会选择replace,因为您没有使用正则表达式。

【讨论】:

  • 谢谢!情况正是如此
  • @user1217222 很高兴我能帮上忙。
【解决方案2】:

应该是

sb.append("\n"); 

否则,您将使用"\\n" 获得'\''n'


但我建议你使用:

sb.append(System.getProperty("line.separator"));

System.getProperty("line.separator") 在这里为您提供了 Java 中与平台无关的换行符。同样来自 Java 7 的还有一个直接返回值的方法:System.lineSeparator()

【讨论】:

  • 我相信unEscapString 可以按预期工作,尽管它的名字很糟糕。它将实际的换行符转换为文本\n。 (换句话说,它为导出转义了一个字符串。)注意case 语句中的换行符和制表符。问题在于尝试将实际的换行符放回原处时。
  • 抛开命名约定,jpmc26 在我想做的事情中是正确的
【解决方案3】:

如果你想在字符串中添加一个实际的换行符,它应该是 \n,而不是 \\n。你有它的方式,它被解释为一个反斜杠,然后是一个'n'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多