我有一个包含布尔逻辑的字符串,类似于:
var test = "(true)&&(false)&&!(true||true)"
如何在JavaScript中评估此字符串以获取布尔值false的好方法是什么?
- 我知道我们可以使用eval()或new Function()..-但这是安全的方法吗?
- 我猜另一个选择是编写自定义解析器。作为JS的新手,这会需要很大的努力吗?我找不到任何布尔逻辑表达式解析器的示例
- 还有其他替代方案吗?
我有一个包含布尔逻辑的字符串,类似于:
var test = "(true)&&(false)&&!(true||true)"
如何在JavaScript中评估此字符串以获取布尔值false的好方法是什么?
var test = "(true)&&(false)&&!(true||true)"
var safe = test.replace(/true/ig, "1").replace(/false/ig, "0");
var match = safe.match(/[0-9&!|()]*/ig);
if(match) {
var result = !!eval(match[0]);
}
var i = result ? 1 : 0;
布尔值
,可以是True
或False
。(1)&(0)&!(1||1)
我希望你现在能更好地评估这个布尔逻辑。
您可以使用eval,例如:eval("(true)&&(false)&&!(true||true)");
试试这段代码
function processExpression(expr)
{
while (expr.indexOf("(" ) != -1 )
{
expr = expr.replace(/\([\w|]+\)/g, function(matched){ return processBrace(matched)});
}
return expr = processBrace( "(" + expr + ")" );
}
function processBrace(str)
{
return str.substring(1).slice(0,-1).split(/(?=&|\|)/).map(function(value,index,arr){
if ( index != 0 && index%2 == 0 ) { return arr[index-1] + value } else if(index==0){return value;} else {return ""}
}).filter(function(val){return val.length > 0}).reduce(function(prev,current){
var first = Boolean(prev);
var operator = current.substring(0,2);
var operand = current.substring(2);
while ( operand.indexOf("!") != -1 )
{
var boolval = operand.match(/\w+/)[0] == "false"; //flip the value by comparing it with false
var negations = operand.match(/\W+/)[0];
operand = negations.substring(1) + boolval;
}
var second = operand == "true";
var output = operator == "&&" ? (first && second) : (first || second);
return output;
});
}
演示
function processExpression(expr)
{
while (expr.indexOf("(" ) != -1 )
{
expr = expr.replace(/\([\w|]+\)/g, function(matched){ return processBrace(matched)});
}
return expr = processBrace( "(" + expr + ")" );
}
function processBrace(str)
{
return str.substring(1).slice(0,-1).split(/(?=&|\|)/).map(function(value,index,arr){
if ( index != 0 && index%2 == 0 ) { return arr[index-1] + value } else if(index==0){return value;} else {return ""}
}).filter(function(val){return val.length > 0}).reduce(function(prev,current){
var first = Boolean(prev);
var operator = current.substring(0,2);
var operand = current.substring(2);
while ( operand.indexOf("!") != -1 )
{
var boolval = operand.match(/\w+/)[0] == "false"; //flip the value by comparing it with false
var negations = operand.match(/\W+/)[0];
operand = negations.substring(1) + boolval;
}
var second = operand == "true";
var output = operator == "&&" ? (first && second) : (first || second);
return output;
});
}
var example1 = "(true)&&(false)&&!(true||true)";
document.body.innerHTML += example1 + " -- " + processExpression(example1);
尝试在三元运算符条件中使用 "".match()
"(true)&&(true)&&!(true||true)".match(/false/ig)?false:true
!
符号。 - thealpha93!
,我只是从提问者那里复制了它。谢谢。 - Muhammad Kamran
"(1)&(0)&!(1||1)"
(所有令牌只有1个字符),那么解析将更容易。 - Oriolnew Function()
没有意义,因为你实际上不需要一个函数,你只需要表达式的结果。 - nnnnnn