Решение на основе предложения @Andreas
public static void main(String[] args) {
String strExpr = "(get(a == b) || b == c ) && ( a == b ? b == c : c == d)";
Expression expr = StaticJavaParser.parseExpression(strExpr);
EnclosedExpr parentExpr = addParentExpr(expr);
processExpr(parentExpr);
expr = removeParentExpr(parentExpr);
// OUTPUT: (get(a.equals(b)) || b.equals(c)) && (a.equals(b) ? b.equals(c) : c.equals(d))
System.out.println(expr);
}
обработка
private static void processExpr(Expression expr) {
expr.stream()
.filter(node -> node instanceof Expression)
.map(node -> ( Expression ) node)
.filter(Expression::isBinaryExpr)
.map(Expression::asBinaryExpr)
.filter(binaryExpr -> binaryExpr.getOperator() == Operator.EQUALS)
.forEach(binaryExpr -> binaryExpr.getParentNode().ifPresent(node -> {
node.replace(binaryExpr, equalsExpr(
binaryExpr.getLeft(), binaryExpr.getRight()));
}));
}
вспомогательные методы
private static EnclosedExpr addParentExpr(Expression expr) {
EnclosedExpr enclosedExpr = new EnclosedExpr();
enclosedExpr.setInner(expr);
return enclosedExpr;
}
private static Expression removeParentExpr(EnclosedExpr parentExpr) {
Expression expr = parentExpr.getInner();
parentExpr.remove(expr);
return expr;
}
private static MethodCallExpr equalsExpr(Expression leftExpr, Expression rightExpr) {
return new MethodCallExpr(leftExpr, "equals", new NodeList<>(rightExpr));
}
Поскольку StaticJavaParser
медленный, есть также возможность использовать JavaParser
с ParseConfiguration
для отключения постобработки и проверки (быстрый анализ).
JavaParser javaParser = new JavaParser(new ParserConfiguration()
.setLanguageLevel(LanguageLevel.RAW));