【JAVA】Java实现逻辑表达式解析与运算

Java实现逻辑表达式解析与运算


import java.util.HashMap;
import java.util.Map;

public class LogicEvaluator {
    public static void main(String[] args) {
        String expression = "${STUDENT_NAME =张三 && (AGE > 18 || GRADE <= 3)}";
        Map<String, Object> variables = new HashMap<>();
        variables.put("STUDENT_NAME", "张三");
        variables.put("AGE", "12");
        variables.put("GRADE", "4");

        boolean result = evaluateLogicExpression(expression, variables);
        System.out.println(result);
    }

    public static boolean evaluateLogicExpression(String expression, Map<String, Object> variables) {
        // 去除大括号
        expression = expression.replace("${", "").replace("}", "");
        if (expression.startsWith("(")){
            expression = expression.replace("(", "").replace(")", "");
        }
        // 处理 "!" 运算符
        if (expression.startsWith("!")) {
            String subExpression = expression.substring(1).trim();
            return !evaluateLogicExpression(subExpression, variables);
        } // 处理 "&&" 运算符
        else if (expression.contains("&&")) {
            String[] parts = expression.split("&&", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return evaluateLogicExpression(leftExpression, variables) && evaluateLogicExpression(rightExpression, variables);
        } // 处理 "||" 运算符
        else if (expression.contains("||")) {
            String[] parts = expression.split("\\|\\|", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return evaluateLogicExpression(leftExpression, variables) || evaluateLogicExpression(rightExpression, variables);
        } // 处理 ">=" 运算符
        else if (expression.contains(">=")) {
            String[] parts = expression.split(">=", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return compareValues(leftExpression, rightExpression, variables) >= 0;
        } // 处理 "<=" 运算符
        else if (expression.contains("<=")) {
            String[] parts = expression.split("<=", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return compareValues(leftExpression, rightExpression, variables) <= 0;
        } // 处理 ">" 运算符
        else if (expression.contains(">")) {
            String[] parts = expression.split(">", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return compareValues(leftExpression, rightExpression, variables) > 0;
        } // 处理 "<" 运算符
        else if (expression.contains("<")) {
            String[] parts = expression.split("<", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return compareValues(leftExpression, rightExpression, variables) < 0;
        } // 处理 "=" 运算符
        else if (expression.contains("=")) {
            String[] parts = expression.split("=", 2);
            String leftExpression = parts[0].trim();
            String rightExpression = parts[1].trim();

            return compareValues(leftExpression, rightExpression, variables) == 0;
        } // 处理单个条件表达式
        else {
            String[] keyValue = expression.split("=");

            String key = keyValue[0].trim();
            String value = keyValue[1].trim().replace("'", "");

            // 根据实际情况进行判断并返回结果
            Object variableValue = variables.get(key);
            if (variableValue instanceof String) {
                return ((String) variableValue).equals(value);
            } else if (variableValue instanceof Integer) {
                return ((Integer) variableValue).equals(Integer.parseInt(value));
            }

            // 如果没有匹配的条件,可以根据实际需求返回 true 或 false
            return false;
        }
    }

    private static int compareValues(String leftExpression, String rightExpression, Map<String, Object> variables) {
        Object leftValue = variables.get(leftExpression);
        Object rightValue = rightExpression;

        if (leftValue instanceof String && rightValue instanceof String) {
            return ((String) leftValue).compareTo((String) rightValue);
        } else if (leftValue instanceof Integer && rightValue instanceof Integer) {
            return Integer.compare((Integer) leftValue, (Integer) rightValue);
        } else {
            throw new IllegalArgumentException("Invalid types for comparison: " + leftExpression + ", " + rightExpression);
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用正则表达式来校验四则运算表达式,包括小数。下面是一个简单的Java实现示例: ```java import java.util.regex.Pattern; public class ExpressionValidator { public static boolean validate(String expression) { // 匹配整数或小数 String numberRegex = "\\d+(\\.\\d+)?"; // 匹配四则运算符号 String operatorRegex = "[+\\-*/]"; // 匹配带括号的子表达式 String subExpressionRegex = "\\(" + numberRegex + operatorRegex + numberRegex + "\\)"; // 构建完整的表达式正则表达式 String regex = "^" + numberRegex + "(" + operatorRegex + numberRegex + "|" + subExpressionRegex + ")*$"; // 使用正则表达式校验表达式 return Pattern.matches(regex, expression); } public static void main(String[] args) { String expression1 = "1+2*3"; String expression2 = "4/(2-3)"; String expression3 = "1.5+3.7/2"; System.out.println(validate(expression1)); // true System.out.println(validate(expression2)); // true System.out.println(validate(expression3)); // true } } ``` 在上面的示例中,我们使用了正则表达式来匹配四则运算表达式。首先,我们定义了三个正则表达式:`numberRegex`用于匹配整数或小数,`operatorRegex`用于匹配四则运算符号,`subExpressionRegex`用于匹配带括号的子表达式。 然后,我们使用这些正则表达式构建了完整的表达式正则表达式表达式以一个数字开始,后面可以跟随一个运算符号和数字,或者一个带括号的子表达式。整个表达式可以重复多次。最后,我们使用`Pattern.matches()`方法来校验输入的表达式是否符合正则表达式的规则。 在`main()`方法中,我们对几个示例表达式进行了校验,并输出结果。以上示例中的表达式都是合法的,所以输出结果都为`true`。 请注意,这只是一个简单的实现示例,对于更复杂的表达式可能需要更复杂的校验逻辑。此外,正则表达式可能不适用于所有情况,因为它们并不是用于解析算术表达式的最佳工具。在实际应用中,可能需要使用更强大的工具或库来处理复杂的算术表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值