评估JavaScript中给出布尔表达式的字符串

Evaluate string giving boolean expression in JavaScript

本文关键字:布尔表达式 字符串 JavaScript 评估      更新时间:2023-11-14

我有一个包含布尔逻辑的字符串,类似于:

var test = "(true)&&(false)&&!(true||true)"

在JavaScript中评估这个字符串以获得布尔值false的好方法是什么

  1. 我知道我们可以使用eval()或new Function()..-但这样做安全吗
  2. 我猜另一种选择是编写一个自定义解析器。作为一个JS的新手,这会是一个很大的努力吗?我找不到任何布尔逻辑表达式的解析器示例
  3. 还有其他选择吗

只要你能保证它是安全的,我认为你可以使用eval。

也许在做评估之前先治疗一下?

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]);
}

Javascript有一个可以使用的三元运算符:

var i = result ? 1 : 0;

这里,结果是BooleanTrueFalse

所以,手术后你的问题会是这样的。

(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