给定新行(\ 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 "
答案 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("((\\\\\\\\)+)", "\\\\");