需求:
(@[(TERMINAL_NUM = '4419232305')@] @AND @[event_num = '441923'@]  or (TERMINAL_NUM = '4419232305') or (event_num = '441904')  or (TERMINAL_NUM = '4645654') @AND @[TERMINAL_NUM = '7876867'@])以上的字符串,每一组 @AND @[ xxx = '.....'@]中,要求把xxx提取出来,如果xxx是唯一的,就要将这个组转变为 and ( xxx='....' ) ,xxx不唯一不处理。  象这种 or (TERMINAL_NUM = '4419232305') 没有@[ @] 的符号即不提取它的xxx,也不作任何处理。处理结果:(@[(TERMINAL_NUM = '4419232305')@] and (event_num = '441923')  or (TERMINAL_NUM = '4419232305') or (event_num = '441904')  or (TERMINAL_NUM = '4645654') @AND @[TERMINAL_NUM = '7876867'@])
我写的代码,有问题public class test { /**
 * @param args
 */
public static void main(String[] args) {
System.out.println(checkAndLogic("(@[(TERMINAL_NUM = '4419232305')@] or (event_num = '441923')  or (TERMINAL_NUM = '4419232305') @AND @[event_num = '441904'@]  or (TERMINAL_NUM = '4645654') @AND @[TERMINAL_NUM = '7876867'@])"));


}


    private static String checkAndLogic(String partly){
     StringBuffer result=new StringBuffer();
     String tempSet="TERMINAL_NUM ,event_num";
     String[] tempArr=tempSet.split(",");
     String part=partly;
     for(int i=0;i<tempArr.length;i++){
     String tempStr=tempArr[i];
     Pattern p=Pattern.compile("((\\@AND)?[\\s]*\\@\\[[\\s]*"+tempStr+")[\\s]*=[\\s]*[^=]*[\\s]*\\@\\]");
     Matcher m=p.matcher(partly);
     if(m.find() && m.group(2)!=null && m.groupCount()<4 ){
     int idx=partly.indexOf(m.group(2));     result.append(part.substring(0,idx)).append(m.group(1).indexOf("@AND")==0?part.substring(idx,part.length()).replaceFirst("\\@AND","and").replaceFirst("\\@\\[","(").replaceFirst("\\@\\]",")"):part.substring(idx,part.length()).replaceFirst("\\@\\[","(").replaceFirst("\\@\\]",")"));
     }else{
     result.append(part);
     }
     part=result.toString();
     result.delete(0,result.length());
     }
    
     return part.length()>0?part:"";
    }


}

解决方案 »

  1.   

    没看明白为什么for(int i=0;i<tempArr.length;i++){
      

  2.   

    题目中
    (@[(TERMINAL_NUM = '4419232305')@] @AND @[event_num = '441923'@]  or (TERMINAL_NUM = '4419232305') or (event_num = '441904')  or (TERMINAL_NUM = '4645654') @AND @[TERMINAL_NUM = '7876867'@])以上的字符串,每一组 @AND @[ xxx = '.....'@]中,要求把xxx提取出来,如果xxx是唯一的,就要将这个组转变为 and ( xxx='....' ) ,xxx不唯一不处理。  象这种 or (TERMINAL_NUM = '4419232305') 没有@[ @] 的符号即不提取它的xxx,也不作任何处理。取出来的应该是一个event_num和一个TERMINAL_NUM,但是为什么结果只替换event_num的?
      

  3.   

    自产自销,搞定了。public class vv { /**
     * @param args
     */
    public static void main(String[] args) {
    System.out
    .println(checkAndLogic("(@[event_num = '441904'@] @AND @[(TERMINAL_NUM = '4419232305')@] or (event_num = '441923')  or (TERMINAL_NUM = '4419232305')  or (TERMINAL_NUM = '4645654') @AND @[TERMINAL_NUM = '7876867'@])")); } /**
     * @param partly
     * @return
     */
    private static String checkAndLogic(String partly) {
    StringBuffer result = new StringBuffer();
    String tempSet = "TERMINAL_NUM";
    String[] tempArr = tempSet.split(",");
    String part = partly;
    for (int i = 0; i < tempArr.length; i++) {
    String tempStr = tempArr[i];
    String pattern="((\\@AND)?[\\s]*\\@\\[\\(?[\\s]*" + tempStr + "[\\s]*=[\\s]*[^=]*[\\s]*\\)?\\@\\])";
    Pattern p0 = Pattern.compile(pattern);
    Matcher m0 = p0.matcher(part);
    int foundNum = 0;
    while (m0.find()) {
    foundNum++;
    }
    System.out.println(tempStr+":"+foundNum);
                Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(part);
    if (foundNum < 2) {
    while (m.find()) {
    System.out.println(m.group(1));
    int idx = part.indexOf(m.group(1));
    result.append(part.substring(0, idx)).append(
    m.group(1).indexOf("@AND") == 0 ? part.substring(
    idx, part.length()).replaceFirst("\\@AND",
    "and").replaceFirst("\\@\\[", "(")
    .replaceFirst("\\@\\]", ")") : part
    .substring(idx, part.length())
    .replaceFirst("\\@\\[", "(").replaceFirst(
    "\\@\\]", ")"));
    part = result.toString();
    result.delete(0, result.length());
    }
    }
    }
    return part.length() > 0 ? part : "";
    }
    }