在javascript正则表达式中使用括号验证布尔表达式

时间:2017-03-01 10:07:12

标签: javascript regex parsing boolean boolean-logic

我想在javascript中验证包含带括号的布尔表达式的字符串。该字符串应仅包含数字1-9()ORAND

良好字符串的示例:

  

“1 AND 2”

     

“2 OR 4”

     

“4 AND(3 OR 5)”

我不确定正则表达式是否足够灵活用于此任务。在javascript中有一个很好的简短方法吗?

2 个答案:

答案 0 :(得分:0)

在JavaScript中,您可以使用以下内容 将'AND / OR / NOT'替换为'&& / || /!' 使用eval进行评估。

小心,因为eval是一个强大的功能

var string = "0 AND 2";
var string1 = "0 OR 2";
var string2 = "NOT 0";
evaluate(string);
evaluate(string1);
evaluate(string2);
function evaluate(string){
  string=string.replace(/AND/g,'&&');
  string=string.replace(/OR/g,'||');
  string=string.replace(/NOT/g,'!');
  console.log(eval(string));
}

答案 1 :(得分:0)

虽然单凭正则表达式对于此任务来说不够强大(因为JS正则表达式无法处理嵌套大括号),但在Javascript的帮助下这是一项简单的任务。

由于我们无法处理嵌套的括号,我们将一次处理一个括号,直到没有留下。模式(?:^ *)?(?:\( *|())[1-9](?: +(?:AND|OR) +[1-9])?(?: *\)|\1)将匹配形式X AND/OR Y和周围大括号(如果有)的表达式。我们用1(或布尔语言中的任何其他有效表达式)替换此模式的所有出现,直到模式不再匹配。

function validate(expression){
  var pattern= /(?:^ *)?(?:\( *|())[1-9](?: +(?:AND|OR) +[1-9])?(?: *\)|\1)/g;
  while(true){
    var replaced= expression.replace(pattern, "1");
    // if the expression has been reduced to "1", it's valid
    if(replaced=="1") return true;
    // if the pattern didn't match, it's invalid
    if(replaced==expression) return false;
    expression= replaced;
    }
}

模式说明:

(?:^ *)?            // if at the start of the string, consume any spaces
(?:\( *|())         // match either "(" or nothing. The empty capture group will be used later.
[1-9]               // match the first digit
(?:                 // if possible, match...
    +(?:AND|OR) +   // "AND" or "OR" surrounded by spaces
    [1-9]           // and a digit
)?
(?: *\)|\1)         // match ")", or, if there was no opening "(", the empty string.