我需要在字符串的grooup中找到特殊的转义java字符(\ n,\ t,\ b等),然后打印哪些字符串包含哪些特殊字符。因此,在打印时,我想将字符值“\ n”更改为“\ n”,将“\ t”更改为“\ t”,依此类推。我为所有这类字符做了一个switch语句。我想知道是否有一个解决方案不涉及检查每个???
答案 0 :(得分:1)
嗯,我不认为正则表达式会让你在一行中进行这种替换,即使使用反向引用也是如此。问题是注入换行符映射到“\ n”的知识,依此类推所有特殊字符。
你当然可以通过一系列的replace()调用来实现,每个角色都有一个,但是你试图避免这种情况。
你需要在Unix中使用等效的'tr'命令,我很遗憾地说我不知道这种方法。
答案 1 :(得分:1)
我没有为此找到一个库,但另一方面,我的快速实现看起来并不太糟糕 - 我甚至比RegExp更喜欢它;)
public String unescape(String s) {
StringBuilder result = new StringBuilder();
for (char c : s.toCharArray()) {
result.append(toLiteral(c));
}
return result.toString();
}
private String toLiteral(char c) {
switch (c) {
case '\n':
return "\\n";
case '\t':
return "\\t";
case '\r':
return "\\r";
case '\f':
return "\\f";
case '\b':
return "\\b";
case '\'':
return "\\\'";
case '\"':
return "\\\"";
case '\\':
return "\\\\";
default:
return c;
}
}
根据我的编译器,这些是字符串允许的所有转义序列。
答案 2 :(得分:1)
在一天结束时,无论使用何种方法,都需要查看字符串中的每个字符。您可以像现在一样在循环中显式执行,也可以通过链接一组replace()调用。但是,虽然这些可能在纸面上看起来更短,但它们可能需要更长的时间。
使用replace()
执行此操作:
"\ttest\n\n".replace("\t", "\\t").replace("\n", "\\n")/*…*/;
要循环执行此操作,请查看answer from Andreas_D。
请注意replace()
方法虽然在纸上较短,但几乎肯定需要更长时间才能运行,因为它必须循环整个字符串8次,一次更换每个转义序列,而手动循环只需要做一次。
编辑:最初我认为你可以用魔法正则表达式来做,但你不能在正则表达式中进行条件替换,这意味着你只能做相当于替换的调用如上所示。鉴于在这种情况下正则表达式稍微慢一点,我认为这不是一个好的解决方案。
答案 3 :(得分:1)
使用map决定替换和StringBuilder.replace方法以实际执行替换的不同方法,它看起来更紧凑,我想它在性能上离开关版本不远,但肯定使用了更多的内存
public class Unescape {
private static final Map<Character, String> replacements = new HashMap<Character, String>(){{
put('\n',"\\n"); put('\r',"\\r"); put('\t',"\\t"); put('\b',"\\b"); //etc
}};
public static String unescape(String s) {
String replace;
StringBuilder result = new StringBuilder(s);
for (int i=0; i < result.length(); i++) {
replace = replacements.get(result.charAt(i));
if (replace!=null) result.replace(i, i+1, replace);
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(unescape("hi\nthere\t\t\tHow are u?"));
}
}
样本的输出是
hi \ nthere \ t \ t \ t \ t你好吗?
答案 4 :(得分:0)
您可以使用正则表达式:
答案 5 :(得分:0)
如果你正在寻找一些有点发烧友的东西,你可以看一下this answer。
答案 6 :(得分:0)
org.apache.commons.lang.StringEscapeUtils。(联合国)EscapeJava方法可能是你想做的两种方式......
来自brainzzy的答案不是我的: