我有一组字符串。我需要能够将此集合中的项目连接成一个字符串,然后将该字符串向后拆分并获取原始字符串集合。 当然,我需要为连接/拆分操作引入一个分隔符。鉴于原始字符串可以包含任何字符,我还需要处理分隔符转义。我的问题非常简单 - 是否有一个Java类/库可以提供开箱即用的所需功能?类似的东西:
String join(String[] source, String delimiter, String escape);
String[] split(String source, String delimiter, String escape);
或类似的,无需手动完成工作?
答案 0 :(得分:6)
没有逃避部分,有:
StringUtils.split(..)
和StringUtils.join(..)
来自guava的Joiner
和Splitter
。答案 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);
}
}