内爆/爆炸字符串:你会建议什么逃避计划?

时间:2012-11-30 10:54:58

标签: java string escaping delimiter

假设我有两个字符串与分隔符“连接”。

String s1 = "aaa", s2 = "bbb"; // input strings
String s3 = s1 + "-" + s2; // join the strings with dash

我可以使用s3.split("-")获取s1s2。现在,如果s1s2包含短划线怎么办?假设s1s2可能包含任何ASCII可打印的内容,并且我不想将不可打印的字符用作分隔符。

在这种情况下,您会建议使用哪种转义

4 个答案:

答案 0 :(得分:4)

如果我可以定义格式,分隔符等,我会使用OpenCSV并使用它的默认值。

答案 1 :(得分:1)

您可以使用不常见的字符序列,例如;:;作为分隔符而不是单个字符。

答案 2 :(得分:1)

这是另一个工作解决方案,它不使用分隔符,但是它会在内爆字符串末尾连接字符串的长度,以便能够在以下情况下重新爆炸:

public static void main(String[] args) throws Exception {
    String imploded = implode("me", "and", "mrs.", "jones");
    System.out.println(imploded);
    String[] exploded = explode(imploded);
    System.out.println(Arrays.asList(exploded));
}

public static String implode(String... strings) {
    StringBuilder concat = new StringBuilder();
    StringBuilder lengths = new StringBuilder();
    int i = 0;
    for (String string : strings) {
        concat.append(string);
        if (i > 0) {
            lengths.append("|");
        }
        lengths.append(string.length());
        i++;
    }
    return concat.toString() + "#" + lengths.toString();
}

public static String[] explode(String string) {
    int last = string.lastIndexOf("#");
    String toExplode = string.substring(0, last);
    String[] lengths = string.substring(last + 1).split("\\|");
    String[] strings = new String[lengths.length];
    int i = 0;
    for (String length : lengths) {
        int l = Integer.valueOf(length);
        strings[i] = toExplode.substring(0, l);
        toExplode = toExplode.substring(l);
        i++;
    }
    return strings;
}

打印:

meandmrs.jones#2|3|4|5
[me, and, mrs., jones]

答案 3 :(得分:0)

为什么不将这些字符串存储在数组中,并在每次要将其显示给用户时使用短划线连接它们?