目前有个需求要根据格式判断用户输入的数学公式是否正确
例1:[计算项]+[计算项]+1000
例2:[计算项](向上取整/向下取整/取绝对值/四舍五入)+[计算项]+1000
运算符包括+ - * /
function checkCalcExpressionValid(string){
// 剔除空白符
string = string.replace(/\s/g, '');
// 错误情况,空字符串
if("" === string){
return false;
}
// 错误情况,运算符连续
if( /[\+\-\*\/]{2,}/.test(string) ){
return false;
}
// 空括号
if(/\(\)/.test(string)){
return false;
}
//空中括号
if (/\[\]/.test(string)){
return false;
}
// 错误情况,括号不配对
var stack = [];
for(var i = 0, item; i < string.length; i++){
item = string.charAt(i);
if('(' === item){
stack.push('(');
}else if(')' === item){
if(stack.length > 0){
stack.pop();
}else{
return false;
}
}
}
if(0 !== stack.length){
return false;
}
// 错误情况,中括号不配对
var stack2 = [];
for(var i = 0, item; i < string.length; i++){
item = string.charAt(i);
if('[' === item){
stack2.push('[');
}else if(']' === item){
if(stack2.length > 0){
stack2.pop();
}else{
return false;
}
}
}
if(0 !== stack2.length){
return false;
}
// 错误情况,(后面是运算符
if(/\([\+\-\*\/]/.test(string)){
return false;
}
// 错误情况,)前面是运算符
if(/[\+\-\*\/]\)/.test(string)){
return false;
}
// 错误情况,[后面是运算符
if(/\[[\+\-\*\/]/.test(string)){
return false;
}
// 错误情况,]前面是运算符
if(/[\+\-\*\/]\]/.test(string)){
return false;
}
//错误情况,运算符号不能在首末位
if(/^[\+\-\*\/.]|[\+\-\*\/.]$/.test(string)){
return false;
}
//错误情况,中括号结尾到下一个开始之间没有运算符
if(/\]\[/.test(string)){
return false;
}
return true;
}
附带正则表达式在线测试链接(方便调试对于自己适用的正则):https://c.runoob.com/front-end/854/
参考链接:https://blog.youkuaiyun.com/notejs/article/details/20608371