在Java中计算布尔值
我试图从字符串中计算以下内容在Java中计算布尔值,java,eval,Java,Eval,我试图从字符串中计算以下内容 boolean value = evaluate("false || true && true && false || true"); 我需要为这一个获取布尔值true。 关于如何以最有效的方式解决这个问题,您有什么想法吗?您需要一个小型布尔表达式语法。一点递归解析就可以了 如果您不知道如何编写这样的解析器,可以使用JavaCC或类似的工具。可以使用ParserGenerator来定义语法 但是,如果您只得到| |和&&as运算符以
boolean value = evaluate("false || true && true && false || true");
我需要为这一个获取布尔值true
。关于如何以最有效的方式解决这个问题,您有什么想法吗?您需要一个小型布尔表达式语法。一点递归解析就可以了
如果您不知道如何编写这样的解析器,可以使用JavaCC或类似的工具。可以使用ParserGenerator来定义语法 但是,如果您只得到| |和&&as运算符以及true和false as值,那么您可以通过实现一个非常简单的有限状态机,轻松完成这项工作: 1.)将字符串拆分为标记 2.)使用Boolean.parseBoolean(标记)解析最左边的值,并在某个实例变量(您的状态)中保护它的值 3.)使用给定运算符将实例变量与下一个布尔标记组合 4.)重复步骤3,直到完成整个字符串 虽然我还没有彻底测试过,但这似乎有效:)
公共类BooleanFSParser{
私有布尔解析(字符串数据){
字符串[]标记=data.split(\\s”);
布尔状态=boolean.parseBoolean(标记[0]);
对于(int i=1;i而言,如果唯一的运算符是&&
和|
,那么我认为这将起作用:
static boolean eval(String str) {
String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
return !s.contains("false") || s.contains("||true");
}
对于更复杂的表达式,我只找到了它。
不知道效率有多高。看看这个问题:thanx Thierry,现在就来看看。@Thierry我认为这不是加载整个Intepreterd的最有效的方法,不要使用公认的答案方法。看看下一个(投票方面)我认为它很好地总结了您的可能性,但它没有直接回答您的问题;-)您的字符串是否可以包含括号和其他运算符,如^or!?谢谢@aioobe,这很好,因为不需要第三方库。您可以通过打破它来优化外部循环(使用while代替for,或在for末尾使用break)一旦结果是真的:它就不可能变成假的again@Thierry,当然。使用正则表达式进行拆分也不是最有效的解决方案:P@aioobe这是否意味着?@c0mraderesult=result | b
…类似于i+=5
,但使用或代替加号。
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
static boolean eval(String str) {
String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
return !s.contains("false") || s.contains("||true");
}