我有一个中缀表达式:((attribute1*attribute2)/attribute3+attribute4)
可能会根据用户输入而有所不同。我想检查表达式是否有效。
有效示例:((attribute1*attribute2)/attribute3+attribute4)
无效示例:(attrribute1*attribute2+*(attribute3)
第二个没有右括号;也不需要*
运算符。如何在javascript中执行此类验证?
现在这是我的正则表达式:
/ *\+? *\-? *[a-zA-Z0-9]+ *( *[\+\-\*\/\=\<\>\!\&\|\%] *\+? *\-? *[a-zA-Z0-9]+ *)*/
我需要使用<=
,>=
,!=
,==
等比较运算符的正则表达式。我该如何实现?
答案 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
参数必须是字符串。
我注意到了一些细节并稍微改变了代码:
\+?\-?
更改了此[\+\-]?
。match
method更改regex test
method。[a-zA-Z0-9]
更改了此(\d+|[a-zA-Z_]\w*)
,因为第一个与53abc
错误的标识符匹配。希望现在对你好:)