需求:
(@[(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:"";
}
}
(@[(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:"";
}
}
(@[(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的?
* @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 : "";
}
}