我正在尝试从字符串
评估以下内容boolean value = evaluate("false || true && true && false || true");
我需要为此获得一个布尔值true
如何以最有效的方式解决这个问题?
答案 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