字符串表示

时间:2010-01-22 21:22:01

标签: java

我需要在字符串的grooup中找到特殊的转义java字符(\ n,\ t,\ b等),然后打印哪些字符串包含哪些特殊字符。因此,在打印时,我想将字符值“\ n”更改为“\ n”,将“\ t”更改为“\ t”,依此类推。我为所有这类字符做了一个switch语句。我想知道是否有一个解决方案不涉及检查每个???

7 个答案:

答案 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)

您可以使用正则表达式:

String.replaceAll

答案 5 :(得分:0)

如果你正在寻找一些有点发烧友的东西,你可以看一下this answer

答案 6 :(得分:0)

org.apache.commons.lang.StringEscapeUtils。(联合国)EscapeJava方法可能是你想做的两种方式......

来自brainzzy的答案不是我的:

https://stackoverflow.com/a/8736043/1130448