62,620
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
String str = "a(c(d(g(,),),f(,))),b(,e(,))";
List<String> paramList = analysisStr(str);
for (String s : paramList) {
System.out.println(s);
}
}
/**
* Description: 解析字符串,截取【从字母开头,紧跟()的参数】,如 a(...) <br>
*/
public static List<String> analysisStr(String template) {
int iBegin = -1; // ( 位置
int iEnd = -1; // ) 位置
int level = -1; // ()层级 控制获取的{}是否同步
boolean isFirstLetter = true;
List<String> paramList = new ArrayList<String>();
for (int i = 0; i < template.length(); i++) {
// 如果是字母,而且是第一个,就算领头字母
if (isFirstLetter && Character.isLetter(template.charAt(i))) {
iBegin = i;
isFirstLetter = false;
}
if ('(' == template.charAt(i)) {
// 只获取第一层
if (level == -1) {
isFirstLetter = false;
}
level++;
continue;
}
if (')' == template.charAt(i)) {
// 第一层参数处理
if (level == 0) {
iEnd = i;
paramList.add(template.substring(iBegin, iEnd + 1));
// continue下一片段匹配
iBegin = -1;
iEnd = -1;
level = -1;
isFirstLetter = true;
}
else if (level > 0) {
level--; // 只匹配第一层
}
continue;
}
}
return paramList;
}
public static int regexHelper(Matcher matcher) {//返回正中央的逗号
int n = 0;
while(matcher.find()) {
String s = matcher.group();
switch(s) {
case "(":
n++;
break;
case ")":
n--;
break;
case ",":
if(n == 0) {
return matcher.end();
}
break;
}
if(n < 0) {
return -1;
}
}
if(n > 0) {
return -1;
} else {
return 0;
}
}