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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:实现网页自适应不同尺寸 屏幕(PC端)
下一篇:avue树形表格无法实现

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年02月29日 08时50分01秒