You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:11:04