【问题标题】:Java - Properly format a String given escape sequences and escape charactersJava - 正确格式化给定转义序列和转义字符的字符串
【发布时间】:2016-10-04 17:25:02
【问题描述】:

给定换行符 (\n)、制表符 (\t) 和转义字符 \ 我如何正确地给出字符串格式,以便正确处理这些转义序列和转义字符。示例 1:

"string \\t \t"

输出将是:

"string \t    "

所以在这种情况下 \\t 被转义为 \t 并且 \t 用制表符格式化

示例 2:

"string \\t \n \\n"

输出是:

"string \t
\n"

我尝试暴力破解解决方案,但它不起作用,因为我在用反斜杠分隔制表符和空格时遇到问题。

String v= "..." //v for value
v = v.replace("\\\"","\"");
v = v.replace("\\\\","\\");
v = v.replace("\\t", "  ");
v = v.replace("\\n", "\n");
v = v.replace("\\\t", "\\t");
v = v.replace("\\\n", "\\n");

如果我通过第一个示例运行该代码,它将给出:

"string         "

【问题讨论】:

  • \\ 是反斜杠的转义。 \n 是换行符的转义。 \t 是制表符的转义。 \\" 是转义报价。真的就是这么简单。您说您“尝试暴力破解解决方案”,但您没有说您要解决什么,那么您希望我们如何帮助您?
  • 您的意思是说您希望\\t 被评估为\[tab] 而不是\t
  • @Andreas \\ 应该转义反斜杠, \\t 或 \\n 应该转义制表符或换行符是
  • @Zircon 我希望 \\t 成为文字 \t
  • 因此您想要一个包含\ 后跟t 的字符串,以便更新以用单个tab替换两个字符的子字符串\t > 性格?如果是这样,请更新您的问题并明确说明。

标签: java string escaping


【解决方案1】:

看起来你没有尝试的一个“蛮力”组合是正确的

replace("\\t", "\t")

阅读“将所有组合替换为

把它们串在一起得到

v = v.replace("\\t", "\t").replace("\\n", "\n")

(不用自己替换\)

【讨论】:

    【解决方案2】:

    您可以先替换转义符号,然后用单斜杠替换转义斜杠:

    [\, \, \, n] -> [\, \, \n] -> [\, \n]
    

    我们可以通过查找出现的两个斜杠对来做到这一点:

    (^|[^\\])(\\\\)*
    
    - (^|[^\\]) is the start of the string or not a slash
    - (\\\\)* is slash pairs
    

    将此与您要替换的符号结合起来(例如\n):

    ((^|[^\\])(\\\\)*)(\\n)
    

    然后我们为java转义这个字符串:

    ((^|[^\\\\])(\\\\\\\\)*)(\\\\n)
    

    现在您可以为此正则表达式编写一个辅助方法,它保留第一组 $1 并替换第二组:

    public static String replaceEscapedChar(
        final String source, 
        final char escaped, 
        final char actual
    ) {
        final String replacee = "(\\\\" + escaped + ")";
        final String replacement = "$1" + actual;
        return source.replaceAll("((^|[^\\\\])(\\\\\\\\)*)" + replacee, replacement); 
    }
    

    例如。以下产生:

    replaceEscapedChar("Test\\\\\\nTest\\\\n", 'n', '\n');
    
    Test\\
    Test\\n
    

    PS:你也可以在后面写上去掉引号:

    source.replaceAll("((\\\\\\\\)+)", "\\\\");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2019-07-28
      • 1970-01-01
      相关资源
      最近更新 更多