假如我现在有一个字符串是 "a(,),b(c(,),)"
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了
如果我把字符串改成
a(b(,e(,)),c(d(g(,),),f(,)))
就不能匹配成
matcher.group(1) = "a(b(,e(,))"
matcher.group(2) = "c(d(g(,),),f(,)))"我自己搜索了下,目测是要用到平衡组这个东西,正在研究中...
有能人不吝赐教
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;
}
}
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;
}