react不用正则校验数学公式合理简单高效的方法
发布日期:2022-03-08 21:50:43
浏览次数:3
分类:技术文章
本文共 2645 字,大约阅读时间需要 8 分钟。
项目场景:
项目今天要用到一个正则表达式,要求能验证一个数学公式格式是否正确。
数学公式中有括号,运算符,数字,和一些固定的变量。
问题描述:
首先做的时候思路是无法用正则来写,只能通过判别错误形式来判断是否公式合理,这是一个麻烦的方法,也很低效。**但是做了一上午之后,发现了一个简单高效的校验,几行代码就搞定,就是利用eval方法**,eval可以运行字符串来当做代码执行,如果报错这公式肯定是不合理的,正确的话则不会报错,这样校验是不是简单了许多呢,比起各种校验错误来判断是否公式合理。下面放出两个方法的源码,大家可以对比一下。
//第一种麻烦的公式校验,利用各种错误来校验是否合理 testFormula =(string)=>{ //校验可出现的字母变量 const obj= { 'Hs': 1, 'Hn': 1, 'Hp' : 1, 'Hh' : 1, 'H' :1, 'Hf' : 1, 'DAM' : 1, 'i' :1, }; 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; } //判断是否有中文 let reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); if(reg.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; } // 错误情况,(后面是运算符 if(/\([\+\-\*\/]/.test(string)){ return false; } // 错误情况,)前面是运算符 if(/[\+\-\*\/]\)/.test(string)){ return false; } // 错误情况,(前面不是运算符 if(/[^\+\-\*\/]\(/.test(string)){ return false; } //错误情况,使用除()+-*/之外的字符 if(/[^\+\-\*\/0-9.a-zA-Z\(\)]/.test(string)){ return false; } // 错误情况,)后面不是运算符 if(/\)[^\+\-\*\/]/.test(string)){ return false; } // 错误情况,变量没有来自“待选公式变量” var tmpStr = string.replace(/[\(\)\+\-\*\/]{ 1,}/g, '`'); var array = tmpStr.split('`'); for(var i = 0, item; i < array.length; i++){ item = array[i]; if( /[A-Z]/i.test(item) && 'undefined' === typeof(obj[item]) ){ return false; } } return true; }
接下来是第二种简单高效的
//利用eval方法校验 testEval=(string)=>{ if(string==''){ return true }else{ //因为会把//或*/ 或/*执行为注释,比如H5不会报错,所以要先判断是否包含这些特殊字符 if(string.indexOf("//") != -1||string.indexOf("*/") != -1 ||string.indexOf("/*") != -1){ return false }else{ let str='let H=1,W=1,F=1,L=1;let result='+string+';'; try { eval(str); return true }catch (e) { return false } } } }
转载地址:https://blog.csdn.net/m0_55588706/article/details/121529743 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年02月29日 08时50分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis在linux环境下的安装
2019-04-21
javascript从定义到执行 js引擎 闭包
2019-04-21
smarty缓存函数
2019-04-21
Mysql配置优化
2019-04-21
SQL的四种连接(左外连接、右外连接、内连接、全连接)
2019-04-21
C语言编程
2019-04-21
Bootstrap基础10(标签页)
2019-04-21
Vue系列之 => 自定义全局指定让文本框自动获取焦点
2019-04-21
前端学习之路-CSS介绍,Html介绍,JavaScript介绍
2019-04-21
PHP全栈从入门到精通1
2019-04-21
第四周总结
2019-04-21
Linux安装jdk
2019-04-21
【转】MATLAB在一幅图上添加多个纵坐标轴
2019-04-21
linux c编程操作数据库(sqlite3应用)
2019-04-21
jQuery中.live()方法的使用方法
2019-04-21
核心技术篇:1.移动应用的根源---网络
2019-04-21
Codis集群的搭建与使用
2019-04-21
如何在Linux环境下编译lib 库
2019-04-21
KVC 字典转模型构造函数
2019-04-21
ios 线程笔记(一)
2019-04-21