评估JavaScript中给出布尔表达式的字符串
Evaluate string giving boolean expression in JavaScript
我有一个包含布尔逻辑的字符串,类似于:
var test = "(true)&&(false)&&!(true||true)"
在JavaScript中评估这个字符串以获得布尔值false的好方法是什么
- 我知道我们可以使用eval()或new Function()..-但这样做安全吗
- 我猜另一种选择是编写一个自定义解析器。作为一个JS的新手,这会是一个很大的努力吗?我找不到任何布尔逻辑表达式的解析器示例
- 还有其他选择吗
只要你能保证它是安全的,我认为你可以使用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;
这里,结果是Boolean
值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
相关文章:
- 将电子邮件验证正则表达式字符串存储在JSON中
- 带有模式的正则表达式字符串
- 布尔表达式-与AND、OR逻辑运算符混淆以及它们的工作方式
- Javascript if数组包含正则表达式字符串
- 在JSON中指定正则表达式字符串,在JavaScript和PHP中使用
- 什么's VBA和Javascript布尔表达式之间的区别
- 评估JavaScript中给出布尔表达式的字符串
- 从正则表达式文本中获取正则表达式字符串表示的最佳方式
- 从树遍历中构建布尔表达式的算法
- = vs === 布尔表达式的运算符
- ngAnimateSwap-使用布尔表达式不会按预期设置动画
- 正则表达式 - 字符串不能以空格开头,以空格结尾,并且连续包含几个空格
- 正则表达式 - 字符串不应包含超过 7 位数字
- 在 javascript 中将正则表达式字符串转换为正则表达式不同
- 为什么这个布尔表达式不返回 true
- 为 STRING 创建一个语法表达式.字符串.PEG上的绳子.js
- Javascript:测试单个字符在正则表达式字符串中找到
- 正则表达式(字符串比较)
- 在不带eval的Javascript中计算字符串中的布尔表达式
- 解析节点/表达式中布尔查询字符串参数的正确方法