【问题标题】:how to evaluate a string in the format (AND, true, false, (OR, true, false, false, (AND, false, true))) in Javascript?如何在Javascript中评估格式为(AND,true,false,(OR,true,false,false,(AND,false,true)))的字符串?
【发布时间】:2020-12-15 13:33:59
【问题描述】:

例如,我有(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

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

解决这个问题的任何解决方案都将是一个巨大的帮助。提前致谢

【问题讨论】:

  • 没有原生的。你必须自己解析它。如果您正在创建该字符串,请考虑改用 JSON.stringify()。这至少可以省去你想弄清楚如何把它拆开的麻烦。
  • 请展示您为自己解决此问题所做的任何尝试。您应该尝试过,然后我们可以帮助您进行调试。 meta.stackoverflow.com/questions/261592/… 还评论How to Ask

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您正在尝试编写可以评估任何(格式正确)表达式的代码,例如您给出的示例,那么您正在寻找为您的语言编写解析器。

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

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

    【讨论】:

      【解决方案3】:

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

      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)))'));

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 2015-03-15
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        相关资源
        最近更新 更多