如何在Javascript中评估格式为(AND,true,false,(OR,true,false,false,(AND,false,true))的字符串?

时间:2020-08-26 17:33:30

标签: javascript logical-operators boolean-expression expression-evaluation

例如,我有一个(AND, true, false, (OR, true, false, false, (AND, false, true)))格式的字符串,JavaScript中有没有一种方法可以将这个字符串评估为布尔值?

expression 1: (AND, true, false) => false

expression 2: (AND, true, (OR, false, true)) will evaluate to => (AND, true, true) => true

像这样,我们可以有一个带有嵌套条件的表达式。

解决这个问题的任何解决方案都会有很大帮助。预先感谢

3 个答案:

答案 0 :(得分:0)

一种选择是使用正则表达式匹配不包含任何嵌套括号的(OR ...(AND序列,并将其替换为适当的resolve值。递归执行此操作,直到字符串中只有一个项目为止:

const parse = (input) => {
  while (input.includes(' ')) {
    input = input.replace(
      /\((AND|OR)([^()]+)\)/g,
      (_, type, restOfBlock) => {
        // Words will become an array of the words present here, eg ['true', 'false']
        const words = restOfBlock.match(/\w+/g);
        if (type === 'OR') return words.includes('true');
        return !words.includes('false');
      }
    );
  }
  return input === 'true';
};

console.log(parse(`(AND, true, false, (OR, true, false, false, (AND, false, true)))`)); // expression 0
console.log(parse(`(AND, true, false)`)); // expression 1
console.log(parse(`(AND, true, (OR, false, true))`)); // expression 2

答案 1 :(得分:0)

如果您试图编写将对任何(格式正确的)表达式进行求值的代码(例如您所提供的示例),那么您正在寻找一种针对您的语言的解析器。

退一步:您的示例似乎是表示逻辑表达式的语言的示例。它看起来像“定制”产品,因此不太可能找到现成的解决方案,但是创建自己的解决方案也不太困难。

我建议您调查PEG.js。这个包是一个解析器生成器:您给它一个描述您的语言的文件,它将生成用于解析它的Javascript代码。

答案 2 :(得分:0)

您可以替换一些部分以获得可评估的字符串。

function evaluate(string) {
    const
        AND = (...args) => args.every(Boolean),
        OR = (...args) => args.some(Boolean);
    return eval(string.replace(/\(([^,]+),\s*/g, '$1('));
}


console.log(evaluate('(AND, true, true)'));

console.log(evaluate('(AND, true, false, (OR, true, false, false, (AND, false, true)))'));