Java:构建逻辑表达式并进行验证

4
我有一个小功能,需要确定用户创建的规则是否符合语法。我正在构建的结构如下所示:
  • 1 == 1
  • 1 + 1 == 1
  • 1 + 1 == 1 OR 1 == 1
  • 以上示例的更多组合
这些表达式保存在字符串变量中,例如:
String expression = "";

while(items.hasNext())
{
    String currentItem = items.next();
    expression += currentItem.value();
}

//Check if the expression is valid

有效表达式

有效表达式是具有逻辑运算符(<、<=、==、=>和>),且输出为true或false(无论哪个)的表达式。

  • 1 == 1
  • 1 < 2
  • 1 == 1或1 < 4
  • 4 == 9或9 == 3

无效表达式

无效表达式没有正确的结构,以确定该表达式是true还是false。

  • 1
  • 1 + 1
  • 1 ===
  • ==1
  • 1
  • 11(即数字后跟数字)

注意

我尝试使用

Boolean.valueOf(String)

Boolean.parse(String)

其他类型的布尔方法


1
新的javax.script.ScriptEngineManager().getEngineByName("js").eval("yourString");。请注意,对于诸如1+1之类的表达式,它不会抛出任何异常,但您可以验证结果是否为布尔值。 - Jean-François Savard
Boolean.parse期望接收"true"或"false"这样的值。你需要用一些解释的方式来处理。 - alter_igel
@Jean-FrançoisSavard 这是个不错的想法,但脚本结果也将为任何布尔表达式返回 true/false。您还需要检查所有标记是否都是有效标记并且结果是布尔值。 - Andrew Eisenberg
啊,没错,我很累,抱歉。 - Jean-François Savard
顺便提一下,在循环中连接字符串时,应该使用 StringBuilder。 - Jean-François Savard
你可以/应该使用类似JEval或Commons Math这样的库来解析这些表达式。 - Mick Mnemonic
1个回答

4

编辑:现在不允许任何表达式执行成功。

编辑2:以下是被评估的示例。

import javax.script.ScriptEngineManager;
import javax.script.*;

public class HelloWorld{

    public static void main(String[] args) 
    {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        String expression = "1+2";   // evaluates to Failure: 3
        String expression = "1+a";   // evaluates to Failure:
        String expression = "1==1";  // evaluates to Success: true
        String expression = "1==2";  // evaluates to Failure: false
        try
        {
            Object result = engine.eval(expression);

            if(result instanceof Boolean)
            {
                System.out.print("Success: ");
                System.out.println(result);
            }
            else
            {
                System.out.print("Failure: ");
                System.out.println(result);
            }
        }
        catch(ScriptException e)
        {
            // handle
            System.out.println("Failure");
        }
    }
}

https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngine.html

https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngineManager.html


这将对所有有效的JS表达式返回成功,这不是OP想要的。 - Andrew Eisenberg
@Andrew Eisenberg 是的,确实如此。对于所有有效的 JS 表达式,它将返回 true 或 false。 - Luis Deras
这仍然不正确,例如像 "\"hi\".equals(\"hi\")" 这样的表达式将返回 true,但是无效。 - Jean-François Savard
@Jean-FrançoisSavard 这是正确的,但如果OP知道输入只会是整数和比较运算符,那么这就不是问题。我承认这不是一个完美健壮的解决方案,但它可能能够满足OP的要求,因为它可以正确地评估他们的示例输入。 - Queue
1
"(1|1)==1"会返回true,但它是无效的整数比较。 - Jean-François Savard
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接