如何在javascript中验证中缀表示法?

时间:2013-12-30 05:32:18

标签: javascript validation expression comparison-operators infix-notation

我有一个中缀表达式:((attribute1*attribute2)/attribute3+attribute4)

可能会根据用户输入而有所不同。我想检查表达式是否有效。

有效示例:((attribute1*attribute2)/attribute3+attribute4)

无效示例:(attrribute1*attribute2+*(attribute3)

第二个没有右括号;也不需要*运算符。如何在javascript中执行此类验证?

现在这是我的正则表达式:

/ *\+? *\-? *[a-zA-Z0-9]+ *( *[\+\-\*\/\=\<\>\!\&\|\%] *\+? *\-? *[a-zA-Z0-9]+ *)*/

我需要使用<=>=!===等比较运算符的正则表达式。我该如何实现?

1 个答案:

答案 0 :(得分:4)

您可以尝试这样的事情:

function validateInfix(infix) {
    var balance = 0;
    // remove white spaces to simplify regex
    infix = infix.replace(/\s/g, '');

    // if it has empty parenthesis then is not valid
    if (/\(\)/.test(infix)) {
        return false;
    }

    // valid values: integers and identifiers
    var value = '(\\d+|[a-zA-Z_]\\w*)';
    // the unary '+' and '-'
    var unaryOper = '[\\+\\-]?';
    // the arithmetic operators
    var arithOper = '[\\+\\-\\*\\/]';
    // the comparison operators
    var compOper = '(\\<\\=?|\\>\\=?|\\=\\=|\\!\\=)';

    // if it has more than one comparison operator then is not valid
    if (infix.match(new RegExp(compOper, 'g')).length > 1) {
        return false;
    }

    // the combined final regex: /[\+\-]?(\d+|[a-zA-Z_]\w*)(([\+\-\*\/]|(\<\=?|\>\=?|\=\=|\!\=))[\+\-]?(\d+|[a-zA-Z_]\w*))*/
    var regex = new RegExp(unaryOper + value + '((' + arithOper + '|' + compOper + ')' + unaryOper + value + ')*');

    // validate parenthesis balance
    for (var i = 0; i < infix.length; i++) {
        if (infix[i] == '(') {
            balance++;
        }
        else if (infix[i] == ')') {
            balance--;
        }

        if (balance < 0) {
            return false;
        }
    }

    if (balance > 0) {
        return false;
    }

    // remove all the parenthesis
    infix = infix.replace(/[\(\)]/g, '');

    return regex.test(infix);
}

我们的想法是首先检查括号平衡,然后删除它们,因为我们只想验证而不是评估,然后将剩余的表达式与正则表达式匹配(这可能不完美,我不是正则表达式专家)。并且......以防万一:infix参数必须是字符串。

修改

我注意到了一些细节并稍微改变了代码:

  1. 添加了您需要正则表达式匹配的运算符。
  2. 删除空格以摆脱正则表达式垃圾。
  3. 检查表达式是否为空括号。
  4. 检查表达式是否有多个比较运算符。
  5. 通过此\+?\-?更改了此[\+\-]?
  6. 尽可能string match method更改regex test method
  7. [a-zA-Z0-9]更改了此(\d+|[a-zA-Z_]\w*),因为第一个与53abc错误的标识符匹配。
  8. 为了更好地理解和清晰,将正则表达式的片段提取到单独的变量中并从中构建最终的变量。
  9. 希望现在对你好:)