如何使用Regex验证表达式的变量与允许数学函数合规性
表达式合法性校验解决方案
问题场景
现有代码场景:
var variables = ['A','B']; var allowedMathFunc = ['Sin','Cos','Tan'] var expression= 'Sin(B)+Tan(B)+100+acos(A)+C'
需要验证表达式满足两个规则:
- 表达式只能用
variables数组里的变量 - 表达式不能包含
allowedMathFunc数组以外的数学函数
用户尝试的代码:
var variables = ['A','B']; var allowedMathFunc = ['Sin','Cos','Tan'] var expression= 'Sin(B)+Tan(B)+100+acos(A)' // 变量校验尝试代码 let expressionVariables = value.replace(/Sin|Log|Exp|Tan|Pos|Rnd|[^A-Za-z]/ig,""); let expressionUnUsedVar= variables.filter(v=> !expressionVariables.includes(v));
用户需求:需要编写符合两种校验场景的正则,分开写也可以。
解决方案
1. 变量合法性校验
先清理表达式里的干扰内容(合法函数、数字、运算符、括号等),提取出所有用到的变量,再和允许列表对比:
// 生成匹配合法函数的正则(函数名大小写敏感,比如Sin和acos会被区分) const allowedFuncRegex = new RegExp(`(${allowedMathFunc.join('|')})`, 'g'); // 清理后得到所有用到的变量(去重) const usedVariables = expression .replace(allowedFuncRegex, '') // 移除允许的函数 .replace(/[0-9+\-*/()\s.]/g, '') // 移除数字、运算符、括号等非变量字符 .split('') // 拆成单个字符(假设变量都是单字母) .filter((v, index, arr) => arr.indexOf(v) === index); // 去重 // 找出不在允许列表里的变量 const invalidVars = usedVariables.filter(v => !variables.includes(v)); const isVarsValid = invalidVars.length === 0; console.log('无效变量:', invalidVars); console.log('变量校验通过:', isVarsValid);
2. 数学函数合法性校验
匹配所有以字母开头、后面紧跟(的函数名,再和允许列表对比:
// 提取所有函数名(匹配规则:字母组成,后面跟着() const allFuncs = expression.match(/[A-Za-z]+(?=\()/g) || []; const uniqueFuncs = [...new Set(allFuncs)]; // 去重 // 找出不在允许列表里的函数 const invalidFuncs = uniqueFuncs.filter(func => !allowedMathFunc.includes(func)); const isFuncsValid = invalidFuncs.length === 0; console.log('无效函数:', invalidFuncs); console.log('函数校验通过:', isFuncsValid);
完整校验示例
把两个校验逻辑整合:
var variables = ['A','B']; var allowedMathFunc = ['Sin','Cos','Tan'] var expression= 'Sin(B)+Tan(B)+100+acos(A)+C' // 变量校验 const allowedFuncRegex = new RegExp(`(${allowedMathFunc.join('|')})`, 'g'); const usedVariables = expression .replace(allowedFuncRegex, '') .replace(/[0-9+\-*/()\s.]/g, '') .split('') .filter((v, index, arr) => arr.indexOf(v) === index); const invalidVars = usedVariables.filter(v => !variables.includes(v)); const isVarsValid = invalidVars.length === 0; // 函数校验 const allFuncs = expression.match(/[A-Za-z]+(?=\()/g) || []; const uniqueFuncs = [...new Set(allFuncs)]; const invalidFuncs = uniqueFuncs.filter(func => !allowedMathFunc.includes(func)); const isFuncsValid = invalidFuncs.length === 0; // 最终校验结果 const isExpressionValid = isVarsValid && isFuncsValid; console.log('表达式合法:', isExpressionValid); console.log('无效变量:', invalidVars); console.log('无效函数:', invalidFuncs);
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

