如果是括号里面再套括号呢? 针对以下表达式,字符串.split("AND")会产生错乱的现象. ( Express1 AND Express2 ) AND ( Express3 AND Express4 )
如果表达式变成以下情况,字符串.split("OR") 就可以分割成两个表达式: (1)( Express1 AND Express2 ) (2)( Express3 AND Express4 )( Express1 AND Express2 ) OR( Express3 AND Express4 )
以下是本人写的一个简单的解析分解最小单位表达式和运算表达符号,请大家指点,是否可以优化并写的 更高效?先谢了. public class expressionParse { private static int A3(String express) { int flag = 0; int pos = 0; if (express.indexOf("(") >= 0) { char[] strs = express.toCharArray(); for (int i = 0; i < strs.length; i++) { if ((strs[i]) == '(') flag++; else if (strs[i] == ')') { flag--; if (flag == 0) { pos = i; break; } } } } return pos; } private static String A2(String express) { String single = ""; if (express.indexOf("(") == 0) { int pos = A3(express); express = express.substring(pos + 1, express.length()); } int orPos = express.indexOf("OR"); int andPos = express.indexOf("AND"); if (orPos != -1) { if (andPos != -1) { if (orPos < andPos) single = "OR"; else single = "AND"; } else single = "OR"; } else if (andPos != -1) single = "AND"; return single; } //无括号子表达式处理方法 private static void A1(String express) { String single=A2(express); System.out.println("子表达式:"+express); System.out.println("子表达式操作符:"+single); if ("OR".equals(single)) { boolean flag=false; String[] strs=express.split("OR"); for (int i=0;i<strs.length && !flag;i++) System.out.println("最小单位表达式:"+strs[i].trim()); } else if ("AND".equals(single)) { boolean flag=true; String[] strs=express.split("AND"); for (int i=0;i<strs.length && flag;i++) System.out.println("最小单位表达式:"+strs[i].trim()); } } private static void A4(String express) { String orAndStr=A2(express); if ("OR".equals(orAndStr)) { for (int i=express.length();i>0 ;i=express.length()) { if (express.indexOf("(") == 0) { int pos = A3(express); String subExpress = express.substring(1, pos).trim(); A4(subExpress); express = express.substring(pos + 1, express.length()).trim(); if (express.indexOf("OR") == 0) express = express.substring(2, express.length()).trim(); } else if (express.indexOf("(") > 0) { String subExpress = express.substring(0,express.indexOf("OR")).trim(); A1(subExpress); int a0 = express.indexOf("("); int pos = A3(express); express = express.substring(a0 + 1, pos).trim(); } else { if (!"".equals(express)) { A1(express); express = ""; } } } } else if ("AND".equals(orAndStr)) { boolean flag = true; for (int i = express.length(); i > 0 && flag; i = express.length()) { if (express.indexOf("(") == 0) { int pos = A3(express); String subExpress = express.substring(1, pos).trim(); A4(subExpress); express = express.substring(pos + 1, express.length()).trim(); if (express.indexOf("AND") == 0) express = express.substring(3, express.length()).trim(); } else if (express.indexOf("(") > 0) { String subExpress = express.substring(0,express.indexOf("AND")).trim(); A1(subExpress); int a0 = express.indexOf("("); int pos = A3(express); express = express.substring(a0 + 1, pos).trim(); } else { if (!"".equals(express)) { A1(express); express = ""; } } } } } public static void main(String[] args) {
//String str="( Express1 AND ( Express2 OR Express3 ) ) AND ( Express4 AND Express5 )"; //String str="Express1 AND ( Express2 AND Express3 )"; //String str="Express1 OR ( Express2 OR Express3 )"; //String str="Express1 OR Express2 OR Express3"; //String str="Express1 AND Express2 AND Express3"; //String str="( Express1 AND Express2 ) AND ( Express3 AND Express4 )"; //String str="( Express1 AND Express2 ) OR ( Express3 AND Express4 )"; //String str="( Express1 OR ( Express2 OR Express3 ) ) OR ( Express4 AND Express5 )"; String str="( Express1 AND Express2 ) OR ( Express3 OR ( Express4 OR Express6 ) )"; // String str="Express1 AND ( Express2 OR Express3 )";
如果是括号里面再套括号呢? 针对以下表达式,字符串.split("AND")会产生错乱的现象. ( Express1 AND Express2 ) AND ( Express3 AND Express4 )
上面说了啊,分两步,第一步把括号及其内容提取出来,记为一个字表达式;第二步在split。第二步的时候剩下的表达式已经没有括号了,比如表达式 expression1 and (expression2 and expression3),第一步提取出(expression2 and expression3)记为一个字表达式;第二步时,针对剩下的表达式,即”expression1 and“进行split,这样没问题吧?
能给出解析实例方法吗?先谢了
这个网上搜索很多的 http://leon-a.iteye.com/blog/186104
如果是括号里面再套括号呢?
针对以下表达式,字符串.split("AND")会产生错乱的现象.
( Express1 AND Express2 ) AND ( Express3 AND Express4 )
就可以分割成两个表达式:
(1)( Express1 AND Express2 )
(2)( Express3 AND Express4 )( Express1 AND Express2 ) OR( Express3 AND Express4 )
更高效?先谢了.
public class expressionParse {
private static int A3(String express)
{
int flag = 0;
int pos = 0;
if (express.indexOf("(") >= 0) {
char[] strs = express.toCharArray();
for (int i = 0; i < strs.length; i++) {
if ((strs[i]) == '(')
flag++;
else if (strs[i] == ')') {
flag--;
if (flag == 0) {
pos = i;
break;
}
}
}
}
return pos;
}
private static String A2(String express)
{
String single = "";
if (express.indexOf("(") == 0) {
int pos = A3(express);
express = express.substring(pos + 1, express.length());
}
int orPos = express.indexOf("OR");
int andPos = express.indexOf("AND");
if (orPos != -1) {
if (andPos != -1) {
if (orPos < andPos)
single = "OR";
else
single = "AND";
} else
single = "OR";
} else if (andPos != -1)
single = "AND";
return single;
}
//无括号子表达式处理方法
private static void A1(String express)
{
String single=A2(express);
System.out.println("子表达式:"+express);
System.out.println("子表达式操作符:"+single);
if ("OR".equals(single))
{
boolean flag=false;
String[] strs=express.split("OR");
for (int i=0;i<strs.length && !flag;i++)
System.out.println("最小单位表达式:"+strs[i].trim());
}
else if ("AND".equals(single))
{
boolean flag=true;
String[] strs=express.split("AND");
for (int i=0;i<strs.length && flag;i++)
System.out.println("最小单位表达式:"+strs[i].trim());
}
}
private static void A4(String express)
{
String orAndStr=A2(express);
if ("OR".equals(orAndStr))
{
for (int i=express.length();i>0 ;i=express.length())
{
if (express.indexOf("(") == 0) {
int pos = A3(express);
String subExpress = express.substring(1, pos).trim();
A4(subExpress);
express = express.substring(pos + 1, express.length()).trim();
if (express.indexOf("OR") == 0)
express = express.substring(2, express.length()).trim(); } else if (express.indexOf("(") > 0) {
String subExpress = express.substring(0,express.indexOf("OR")).trim();
A1(subExpress);
int a0 = express.indexOf("(");
int pos = A3(express);
express = express.substring(a0 + 1, pos).trim();
} else {
if (!"".equals(express)) {
A1(express);
express = "";
}
}
}
}
else if ("AND".equals(orAndStr))
{
boolean flag = true;
for (int i = express.length(); i > 0 && flag; i = express.length()) {
if (express.indexOf("(") == 0) {
int pos = A3(express);
String subExpress = express.substring(1, pos).trim();
A4(subExpress); express = express.substring(pos + 1, express.length()).trim();
if (express.indexOf("AND") == 0)
express = express.substring(3, express.length()).trim(); } else if (express.indexOf("(") > 0) {
String subExpress = express.substring(0,express.indexOf("AND")).trim();
A1(subExpress);
int a0 = express.indexOf("(");
int pos = A3(express);
express = express.substring(a0 + 1, pos).trim();
} else {
if (!"".equals(express)) {
A1(express);
express = "";
}
}
}
}
}
public static void main(String[] args) {
//String str="( Express1 AND ( Express2 OR Express3 ) ) AND ( Express4 AND Express5 )";
//String str="Express1 AND ( Express2 AND Express3 )";
//String str="Express1 OR ( Express2 OR Express3 )";
//String str="Express1 OR Express2 OR Express3";
//String str="Express1 AND Express2 AND Express3";
//String str="( Express1 AND Express2 ) AND ( Express3 AND Express4 )";
//String str="( Express1 AND Express2 ) OR ( Express3 AND Express4 )";
//String str="( Express1 OR ( Express2 OR Express3 ) ) OR ( Express4 AND Express5 )";
String str="( Express1 AND Express2 ) OR ( Express3 OR ( Express4 OR Express6 ) )";
// String str="Express1 AND ( Express2 OR Express3 )";
System.out.println("表达式:"+str);
System.out.println("表达式操作符:"+A2(str));
A4(str);
}
}
如果是括号里面再套括号呢?
针对以下表达式,字符串.split("AND")会产生错乱的现象.
( Express1 AND Express2 ) AND ( Express3 AND Express4 )
上面说了啊,分两步,第一步把括号及其内容提取出来,记为一个字表达式;第二步在split。第二步的时候剩下的表达式已经没有括号了,比如表达式 expression1 and (expression2 and expression3),第一步提取出(expression2 and expression3)记为一个字表达式;第二步时,针对剩下的表达式,即”expression1 and“进行split,这样没问题吧?