如何在 Javascript 中评估格式为 (AND, true, false, (OR, true, false, false, (AND, false, true))) 的字符串?
how to evaluate a string in the format (AND, true, false, (OR, true, false, false, (AND, false, true))) in Javascript?
例如,我有格式为 (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
像这样我们可以有一个带有嵌套条件的表达式。
解决这个问题的任何解决方案都将是一个巨大的帮助。提前致谢
一个选项是使用正则表达式来匹配不包含任何嵌套括号的 (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
如果您正在尝试编写代码来评估任何 (well-formed) 表达式,就像您给出的示例一样,那么您正在寻求为您的语言编写解析器。
退后一步:您的示例似乎是用于表达逻辑表达式的语言的示例。它看起来像是一种“自定义”语言,因此您不太可能找到 ready-made 解决方案,但创建自己的解决方案并不难。
我建议调查 PEG.js。这个包是一个解析器生成器:你给它一个描述你的语言的文件,它会生成 Javascript 代码来解析它。
您可以替换一些部分以获得可评估的字符串。
function evaluate(string) {
const
AND = (...args) => args.every(Boolean),
OR = (...args) => args.some(Boolean);
return eval(string.replace(/\(([^,]+),\s*/g, '('));
}
console.log(evaluate('(AND, true, true)'));
console.log(evaluate('(AND, true, false, (OR, true, false, false, (AND, false, true)))'));
例如,我有格式为 (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
像这样我们可以有一个带有嵌套条件的表达式。
解决这个问题的任何解决方案都将是一个巨大的帮助。提前致谢
一个选项是使用正则表达式来匹配不包含任何嵌套括号的 (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
如果您正在尝试编写代码来评估任何 (well-formed) 表达式,就像您给出的示例一样,那么您正在寻求为您的语言编写解析器。
退后一步:您的示例似乎是用于表达逻辑表达式的语言的示例。它看起来像是一种“自定义”语言,因此您不太可能找到 ready-made 解决方案,但创建自己的解决方案并不难。
我建议调查 PEG.js。这个包是一个解析器生成器:你给它一个描述你的语言的文件,它会生成 Javascript 代码来解析它。
您可以替换一些部分以获得可评估的字符串。
function evaluate(string) {
const
AND = (...args) => args.every(Boolean),
OR = (...args) => args.some(Boolean);
return eval(string.replace(/\(([^,]+),\s*/g, '('));
}
console.log(evaluate('(AND, true, true)'));
console.log(evaluate('(AND, true, false, (OR, true, false, false, (AND, false, true)))'));