假如我现在有一个字符串是 "a(,),b(c(,),)"
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了

解决方案 »

  1.   

    这个不难 自己参看APi就知道了。上面写得很详细。我不想去帮你做,因为这不是我要解决的问题呵呵。
      

  2.   

    如果没看API我会来问么- -!
      

  3.   

    Pattern p =Pattern.compile("(.\\(,\\)),(.\\(.\\(,\\),\\))");
      

  4.   

    这个只能在我这个例子里实现- -!
    如果我把字符串改成
    a(b(,e(,)),c(d(g(,),),f(,)))
    就不能匹配成
    matcher.group(1) = "a(b(,e(,))"
    matcher.group(2) = "c(d(g(,),),f(,)))"我自己搜索了下,目测是要用到平衡组这个东西,正在研究中...
    有能人不吝赐教
      

  5.   

    是的不支持,所以我就自己实现了个... 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;
    }
    }
      

  6.   

    LZ,或者你可以通过解析字符串来解决问题,下面是字符串解析的代码,你看看,也许能找到点思路 :)
        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;
        }