JS利用正则表达式等 校验数学表达式是否正确
项目中需求需要校验数学表达式是否正确 话不多说直接上代码
// 校验计算式
export function checkCalcExpressionValid(expression) {
// 空字符串检查
if (expression === "" || expression == null || !expression)
return (expression = 0)
// 移除空格并处理数字前的多余零,但对于小数点前的零不处理
expression = expression
.replace(/\s/g, "")
.replace(/(^|[^.\d])0+(?=\d)/g, "$1")
// 检查非法字符(只允许数字、括号、加减乘除运算符和小数点)
if (/[^0-9+\-*/().]/.test(expression)) {
return false
}
// 检查连续三个或更多减号
if (/---+/.test(expression)) {
return false
}
// 替换所有连续的两个减号为单个加号
expression = expression.replace(/--/g, "+")
// 检查非法字符(包括英文字母、逗号)、连续运算符(除了减号)、错误的括号或运算符位置,以及运算符后跟等号的情况
if (
/[a-zA-Z,]|[\+\*\/]{2,}|[\+\-\*\/]=|[\(\)\[\]]{2}|[\+\*\/\.]\)|\([\+\*\/]|[\+\*\/\.]\[|\][\+\*\/\.]|^[\+\*\/\.]|[\+\*\/\.]$/.test(
expression
)
) {
return false
}
// 检查数字后直接跟左括号,或右括号后直接跟数字的情况(隐式乘法)
if (/\d\(|\)\d/.test(expression)) {
return false
}
// 检查括号是否配对
let brackets = { "(": ")", "[": "]" }
let stack = []
for (let char of expression) {
if (brackets[char]) {
stack.push(brackets[char])
} else if (char === ")" || char === "]") {
if (stack.pop() !== char) {
return false
}
}
}
if (stack.length > 0) {
return false
}
// 检查数字格式(例如避免多个连续的小数点)
if (/(\.\d*){2,}/.test(expression)) {
return false
}
// 防止单个运算符
if (/^[+\-*/.]$/.test(expression) === true) {
return false
}
return expression
}
可能有遗漏或者不足 欢迎大佬评论区指教补充