结合正则表达式验证数学公式(含变量,js版)

今天有朋友让我帮他写一个正则表达式,要求能验证一个数学公式格式是否正确。

数学公式中有括号,变量(未知数)和运算符,而且变量是重数据库中读取的,可以任意添加和删除。

这个用一个正则表达式实现是不可能的,所以我给他写了一个函数,如下:

(function(){
	/*
	 * 假如待选变量:  ID,NUM,TOTAL,AVL TEST
	 * 正确的公式例子:ID*NUM+(TOTAL/AVL)*0.5
	 * 错误的公式例子:ID**|0.5
	 */

	function fn(string, obj){// TODO: 如何处理=?
		// 剔除空白符
		string = string.replace(/\s/g, ‘‘);

		// 错误情况,空字符串
		if("" === string){
			return false;
		}

		// 错误情况,运算符连续
		if( /[\+\-\*\/]{2,}/.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(/\)[^\+\-\*\/]/.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;
	}

    // 测试
	var fields = {
		‘ID‘: 1,
		‘TOTAL‘: 1,
		‘AVL‘ : 1,
		‘NUM‘ : 1
	};
    // 提交到服务器端的字符串不应该包含空白符,或者应该禁止用户输入空白符
	alert( fn(‘ID*NUM+(TOTAL/AVL)*0.5‘, fields) );
})();

结合正则表达式验证数学公式(含变量,js版),布布扣,bubuko.com

时间: 2024-10-28 09:48:27

结合正则表达式验证数学公式(含变量,js版)的相关文章

js正则表达式:验证邮箱格式、密码复杂度、手机号码、QQ号码

直接上代码 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

js正则表达式验证

有时候会要验证自己写的正则表达式是否正确 所以写了这个小东西: demo:js正则表达式验证 html: 1 <h3>绿色表示匹配,红色表示不匹配</h3> 2 <label>请在下框填入正则表达式</label><br /> 3 4 <textarea id="regexp"></textarea><br /> 5 6 <label>请在下框填需要验证的式子</label

js正则表达式验证(化繁为简)

以前用js写正则表达式验证,每一个文本框后面都要添加一个onblur函数,验证的信息少,也没体会到有多繁琐,这次项目中的页面比较多,页面中的信息也比较多,如果每个文本框都加一个验证函数的话,js验证代码将会很长,很繁琐. 既然是函数,就可以传参数,这样的话,只需要一个验证函数就可以完成所有的信息验证了. 1.首先新建一个js文件validate.js 1 function validate(o,regex,backInfo){ 2 if(o.value != "" &&

js正则表达式验证【引用网址】

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**************************以下函数调用方式:     function check()     {         var bb = document.getElementById("txt_id&quo

正则表达式控制Input输入内容 ,js正则验证方法大全

https://blog.csdn.net/xushichang/article/details/4041507 正则表达式控制Input输入内容 2009年04月01日 17:15:00 阅读数:21747 不能输入中文 <input type="text" name="textfield"  onkeyup="this.value=this.value.replace(/[^/da-z_]/ig,'');"/>只能输入 数字和下划

JS正则表达式验证各种数字类型

以下内容 Js代码 <script type="text/javascript"> function validate(){ var reg = new RegExp("^[0-9]*$"); var obj = document.getElementById("name"); if(!reg.test(obj.value)){ alert("请输入数字!"); } if(!/^[0-9]*$/.test(obj.

2019手机号码JS正则表达式验证实例代码

这篇文章主要介绍了2019手机号码JS正则表达式验证实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 简介 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符

JS正则表达式验证身份证号码

function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if(reg.test(card) === false) { alert("身份证输入不合法"); return  false; } } 最近的项目中用的需要调用实名认证的接口,实名认证接口价格相比短信而言高了不是几

web开发常用的js验证,利用正则表达式验证邮箱、手机、身份证等输入

正则表达式验证 //邮箱 var emailReg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; email = document.getElementById("email").value; if (!emailReg.test(email)) { win_alert('你输入的邮箱格式不正确!'); return; } //手机号码 var phoneReg = /^(13[0-9]{9})