原字符串: ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss
最终结果: [{0},{style|测试{aa{vv}}},{aa{vv}},{vv},{style|{0}},{0}]
java实现方式:
// 全局变量
private static List<String> strResult = new ArrayList<String>();
// 递归方法
public static void printAll(String src, boolean flag) {
System.out.println(src+" 是否是第一次进递归方法 --:"+flag); // 打印每次进来的值
if (!flag) {
strResult.add("{" + src + "}");// 这里需要补括号
}
List<String> list = getSons(src);
for (String s : list) {
printAll(s, false);
}
}
// 拆分方法
public static List<String> getSons(String src) {
List<String> list = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
// 是否找到左括号标识
boolean start = false;
// 括号叠加层数
int deep = 0;
for (char c : src.toCharArray()) {
if (!start) { // 先让程序进来 为了寻找第一个左括号
if (c == '{') {
start = true; // 找到了左括号
deep++; // 遇到左括号就+1 括号数量递增
}
continue;
} else {
if (c == '{') {
deep++; // 遇到左括号就+1 括号数量递增
sb.append(c);
} else if (c == '}') {
deep--; // 遇到右括号就-1 括号数量递增
if (deep == 0) { // 直到等于零 就说明找到结尾了
list.add(sb.toString()); // 添加到集合
start = false; // 置为fasle 开始下一轮寻找
sb = new StringBuilder(); // 重置
} else {
sb.append(c);
}
} else { // 已经找到了起始左括号 并且不是左括号也不是右括号那就是括号中间的数据 直接拼接起来
sb.append(c);
}
}
}
return list;
}
public static void main(String[] args) {
printAll("ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss", true);
System.out.println("最终结果: "+strResult.toString());
}
控制台输出:
ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss 是否是第一次进递归方法 --:true
0 是否是第一次进递归方法 --:false
style|测试{aa{vv}} 是否是第一次进递归方法 --:false
aa{vv} 是否是第一次进递归方法 --:false
vv 是否是第一次进递归方法 --:false
style|{0} 是否是第一次进递归方法 --:false
0 是否是第一次进递归方法 --:false
最终结果:
[{0}, {style|测试{aa{vv}}}, {aa{vv}}, {vv}, {style|{0}}, {0}]