在Java中评估布尔值

时间:2010-06-04 13:08:09

标签: java eval

我正在尝试从字符串

评估以下内容
boolean value = evaluate("false || true && true && false || true");

我需要为此获得一个布尔值true 如何以最有效的方式解决这个问题?

4 个答案:

答案 0 :(得分:7)

String value = ("false || true && true && false || true");
boolean result = false;
for (String conj : value.split("\\|\\|")) {
    boolean b = true;
    for (String litteral : conj.split("&&"))
        b &= Boolean.parseBoolean(litteral.trim());
    result |= b;
}
System.out.println(result); // prints true

答案 1 :(得分:1)

如果唯一的运营商是&&||,那么我认为这会有效:

  static boolean eval(String str) {
    String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
    return !s.contains("false") || s.contains("||true");
  }

对于更复杂的表达,我发现this library就是为了这个。 不知道它有多高效。

答案 2 :(得分:0)

你需要一个小的布尔表达式语法。一些递归解析应该可以解决问题。

如果您不知道如何编写这样的解析器,可以使用JavaCC或类似的东西。

答案 3 :(得分:0)

可以使用解析器生成器来定义语法。

但如果你只有||和&&作为运算符以及真值和假值,你可以通过一个非常简单的有限状态机来自己轻松地做到这一点:

1。)将字符串拆分为标记

2.。)使用Boolean.parseBoolean(token)解析最左边的值,并在某个实例变量(你的状态)中保护它的值

3.)使用给定的运算符

将您的实例变量与下一个布尔令牌组合

4.。)重复步骤3,直到完成整个字符串

这似乎工作,虽然我没有彻底测试它:))

public class BooleanFSParser {

    private boolean parse(String data) {
        String[] tokens=data.split("\\s");
        boolean state=Boolean.parseBoolean(tokens[0]);
        for (int i=1;i<(tokens.length / 2) + 1;i=i+2){
            if (tokens[i].equals("&&")){
                state=state && Boolean.parseBoolean(tokens[i+1]);
            }else{
                state=state || Boolean.parseBoolean(tokens[i+1]);
            }
        }
        return state;
    }

    public static void main(String[] args) {
        BooleanFSParser parser = new BooleanFSParser();
        boolean val = parser.parse("true && true || false");
        System.out.println(String.valueOf(val));
    }
}

多数民众赞成应该给你一个正确解析的值,但如果你允许使用括号,它会变得更复杂;)

玩得开心,在这里查看理论 Finite-state_machine