Java 如果可能,如何使用正则表达式执行字符串中包含逻辑运算符的表达式

Java 如果可能,如何使用正则表达式执行字符串中包含逻辑运算符的表达式,java,regex,Java,Regex,我从数据库中得到的表达式类似于Category==BWFULL&&Channel==ANDROID&&ver>200。现在我从用户那里得到了任何类别、频道和版本的输入。我必须用上面给出的表达式验证输入。我可以在多个if-else条件下执行此操作。但我不想那样做。有没有最好的方法来计算这个表达式 我也不能使用正则表达式,因为我不知道如何处理大于200的版本。 需要清除更多的!=,>=,200 ScriptEngineManager manager = new ScriptEngineManager

我从数据库中得到的表达式类似于Category==BWFULL&&Channel==ANDROID&&ver>200。现在我从用户那里得到了任何类别、频道和版本的输入。我必须用上面给出的表达式验证输入。我可以在多个if-else条件下执行此操作。但我不想那样做。有没有最好的方法来计算这个表达式

我也不能使用正则表达式,因为我不知道如何处理大于200的版本。 需要清除更多的!=,>=,<这些类别、频道和版本的表达和价值都是动态的

事实上,我不想使用第三方库。我认为ScriptManager可以执行,但表达式必须是Category=\BWFULL\&&Channel=\ANDROID\&&ver>200

ScriptEngineManager manager = new ScriptEngineManager();
       ScriptEngine engine = manager.getEngineByName("js");
       engine.put("Category", "BWFULL");
       engine.put("ver",90);
       engine.put("Channel","ANDROID");
但是对于这个,我必须在我想跳过的表达式中加上倒逗号,这也需要一些时间来计算。那么还有其他解决办法吗

现在我使用regexExpression,比如

Pattern.matches("([a-zA-Z]+ *== *NMW *&&)( *[a-zA-Z]+ *== *android +&&)( *[a-zA-Z]+ *== *nitrogen)", "walletcategory  ==  NMW && channel  ==android && ghb == nitrogen")
但问题仍然在于值>200或顺序。在上面的正则表达式中,表达式的顺序是静态的,但我希望它的顺序是任意的

现在,我花了一些精力,用正则表达式找到了解决方案

public class Main {


    public static void main(String[] args) {


//    
      String str = "walletcategory == NMW && asdfs == airtel && ghb == nitrogen && val >= 200";
        Pattern regex = Pattern.compile("[(>=)(==)(!=)(<=)]{2}|[(<)(>)]");

        evaluateTimeForForLoop(str, regex);

    }

    private static void evaluateTimeForForLoop(String str, Pattern regex) {
        long startTime = System.nanoTime();
      String[] strArr = str.split("&&");
      int len = strArr.length;
      String input[] = {"NMW","airtel","nitrogen"};
      for(int i = 0; i < len-1 ;i++) {
          String opee = strArr[i];
          String op = extractOperatorFromString(opee,regex);
          if(op != null) {
              String right = opee.substring(opee.indexOf(op)+op.length(),opee.length()).trim();
              System.out.println(evaluate(input[i], op, right));
          }

      }
      String str3 = strArr[3];
      String operator = extractOperatorFromString(str3,regex);
      if(operator != null) {
          String right = str3.substring(str3.indexOf(operator)+operator.length(),str3.length()).trim();
          System.out.println(evaluate(100, operator, Integer.parseInt(right)));
      }
        long endTime = System.nanoTime();
          System.out.println(endTime - startTime);
    }



    private static String extractOperatorFromString(String str, Pattern regex) {
        try {
            Matcher regexMatcher = regex.matcher(str);
             boolean bool = regexMatcher.matches();
            if (regexMatcher.find()) {
               return regexMatcher.group();
            } 
        } catch (PatternSyntaxException ex) {
            // Syntax error in the regular expression
        }
        return null;
    }   

    private static boolean evaluate(int left, String op, int right)
    {
            switch (op)
            {
            case "==":
                    return left == right;
            case ">":
                    return left > right;
            case "<":
                    return left < right;
            case "<=":
                    return left <= right;
            case ">=":
                    return left >= right;
            case "!=":
                    return left != right;
            default:
                    System.err.println("ERROR: Operator type not recognized.");
                    return false;
            }
    }
    private static boolean evaluate(String left, String op, String right)
    {
            switch (op)
            {
            case "==":
                    return left.equals(right);
            case "!=":
                    return !left.equals(right);
            default:
                    System.err.println("ERROR: Operator type not recognized.");
                    return false;
            }
    }

}

但是仍然在等待响应,如果有更好的方法使用正则表达式来实现这一点。

这三个选项是静态的还是非静态的?如果您始终有一个类别、频道和版本,则只需将数据库修改为:

requiredCategory
requiredChannel
requiredMinimalVersion (due to > 200)

然后根据用户参数简单地评估这些参数。但是我不希望像您那样将任何约束存储在一个字符串中。

如果我是您,我会使用JPA验证器。使用Groovy、Velocity、jexl或mvel来计算表达式如何?我们可以使用正则表达式来实现这一点吗?类别、频道和版本是动态的。上面的表达式就像一条规则,必须满足用户的输入。有可能在expression.Nah中,我问的是类别、频道和版本是否是您必须评估的唯一值。因为如果这是真的,我强烈建议在单个数据库字段中使用字符串中的每个必需值。将来也不能添加其他属性。然后我仍然建议使用单个数据库字段。如果你继续用绳子这样做,你会陷入困境的。此外,您还降低了应用程序的可维护性。实际上,现在不可能更改数据库中的表。