Java - 正确格式化给定转义序列和转义字符的字符串

时间:2016-10-04 17:25:03

标签: java string escaping

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

"string \\t \t"

输出结果为:

"string \t    "

因此,在这种情况下,\ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ 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         "

2 个答案:

答案 0 :(得分:1)

看起来像你没试过的那种“蛮力”组合是正确的

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

阅读“用< tab>”替换所有<反斜杠>< t>组合

将它们全部串在一起以获得

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

(没有必要自己替换\)

答案 1 :(得分:1)

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

[\, \, \, 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("((\\\\\\\\)+)", "\\\\");