JSqlParser 以这种方式解析您的表达式:
AndExpression
AndExpression
a>10
b>20
c>30
我很想知道您使用哪个版本,如果递归确实在右侧而不是左侧。我使用JSqlParser 0.9-SNAPSHOT。尽管如此,在我的JSqlParser版本中(我认为,因为它是一个 LL 解析器),其他答案中的评论建议代码块
while(ex.getLeftExpression() != null) {
list.add(ex.getLeftExpression());
ex = ex.getRightExpression();
}
不管用。它发现(或收集):
a > 10 AND b > 20
这是一个AndExpression
并且失败了ex = ex.getRightExpression();
,因为权利永远不会是一个AndExpression
。这就是 JSqlParser 的工作原理。递归将AndExpression
在leftExpression
.
所以这里有一个解决方案和一个小测试,使用JSqlParser V0.9-SNAPSHOT,它使用递归方式访问这些AndExpressions
并打印出找到的表达式。我没有将它添加到List
. 请原谅我。
public class JSqlParser1 {
public static void main(String[] args) throws JSQLParserException {
Expression expr = CCJSqlParserUtil.parseCondExpression("a>10 and b>20 and c>30");
expr.accept(new ExpressionVisitorAdapter() {
@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else {
System.out.println(expr.getLeftExpression());
}
System.out.println(expr.getRightExpression());
}
});
}
}
这个打印:
a > 10
b > 20
c > 30