字符串拆分&加入

时间:2012-02-03 14:26:25

标签: java

我有一组字符串。我需要能够将此集合中的项目连接成一个字符串,然后将该字符串向后拆分并获取原始字符串集合。 当然,我需要为连接/拆分操作引入一个分隔符。鉴于原始字符串可以包含任何字符,我还需要处理分隔符转义。我的问题非常简单 - 是否有一个Java类/库可以提供开箱即用的所需功能?类似的东西:

String join(String[] source, String delimiter, String escape);
String[] split(String source, String delimiter, String escape);

或类似的,无需手动完成工作?

3 个答案:

答案 0 :(得分:6)

没有逃避部分,有:

    来自commons-lang
  • StringUtils.split(..)StringUtils.join(..) 来自guava
  • JoinerSplitter

答案 1 :(得分:1)

拆分:String.split将正则表达式作为参数(定界符)并返回String[]作为结果。

答案 2 :(得分:0)

分割并加入转义的分隔符:

@NonNull
public static String joinEscaping(char separator, String... aa) {
    String escape = separator != '\\' ? "\\" : "#"; 

    StringBuilder result = new StringBuilder();

    for (int i = 0; i < aa.length; i++) {
        String a = aa[i];
        a = (a == null) ? "" : a;
        a = a.replace(escape, escape + escape);
        a = a.replace(separator + "", escape + separator);

        result.append(a);
        if (i + 1 < aa.length) {
            result.append(separator);
        }
    }
    return result.toString();
}


public static List<String> splitUnescaping(char separator, @NonNull String str) {
    char escape = separator != '\\' ? '\\' : '#';
    List<String> result = new ArrayList<>();

    int yourAreHere = 0;
    boolean newPart = true;

    while (true) {
        int sep = str.indexOf(separator, yourAreHere);
        int exc = str.indexOf(escape, yourAreHere);
        if (sep == -1 && exc == -1) { // last part
            add(result, str.substring(yourAreHere), newPart);
            break;
        }
        if (sep == -1 && exc + 1 == str.length()) { // ghost escape
            add(result, str.substring(yourAreHere, exc), newPart);
            break;
        }
        if (exc == -1 || (sep != -1 && sep < exc)) {
            add(result, str.substring(yourAreHere, sep), newPart);
            yourAreHere = sep + 1;
            newPart = true;
        } else {
            char next = str.charAt(exc + 1);
            add(result, str.substring(yourAreHere, exc) + next, newPart);
            yourAreHere = exc + 2;
            newPart = false;
        }
    }

    return result;
}


private static void add(List<String> result, String part, boolean newPart) {
    if (newPart) {
        result.add(part);
    } else {
        int last = result.size() - 1;
        result.set(last, result.get(last) + part);
    }
}