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

前端之家收集整理的这篇文章主要介绍了结合正则表达式验证数学公式(含变量,js版)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

  1. (function(){
  2. /*
  3. * 假如待选变量: ID,NUM,TOTAL,AVL TEST
  4. * 正确的公式例子:ID*NUM+(TOTAL/AVL)*0.5
  5. * 错误的公式例子:ID**|0.5
  6. */
  7.  
  8. function fn(string,obj){// TODO: 如何处理=?
  9. // 剔除空白符
  10. string = string.replace(/\s/g,'');
  11. // 错误情况,空字符串
  12. if("" === string){
  13. return false;
  14. }
  15. // 错误情况,运算符连续
  16. if( /[\+\-\*\/]{2,}/.test(string) ){
  17. return false;
  18. }
  19. // 空括号
  20. if(/\(\)/.test(string)){
  21. return false;
  22. }
  23. // 错误情况,括号不配对
  24. var stack = [];
  25. for(var i = 0,item; i < string.length; i++){
  26. item = string.charAt(i);
  27. if('(' === item){
  28. stack.push('(');
  29. }else if(')' === item){
  30. if(stack.length > 0){
  31. stack.pop();
  32. }else{
  33. return false;
  34. }
  35. }
  36. }
  37. if(0 !== stack.length){
  38. return false;
  39. }
  40. // 错误情况,(后面是运算符
  41. if(/\([\+\-\*\/]/.test(string)){
  42. return false;
  43. }
  44. // 错误情况,)前面是运算符
  45. if(/[\+\-\*\/]\)/.test(string)){
  46. return false;
  47. }
  48. // 错误情况,(前面不是运算符
  49. if(/[^\+\-\*\/]\(/.test(string)){
  50. return false;
  51. }
  52. // 错误情况,)后面不是运算符
  53. if(/\)[^\+\-\*\/]/.test(string)){
  54. return false;
  55. }
  56. // 错误情况,变量没有来自“待选公式变量”
  57. var tmpStr = string.replace(/[\(\)\+\-\*\/]{1,}/g,'`');
  58. var array = tmpStr.split('`');
  59. for(var i = 0,item; i < array.length; i++){
  60. item = array[i];
  61. if( /[A-Z]/i.test(item) && 'undefined' === typeof(obj[item]) ){
  62. return false;
  63. }
  64. }
  65. return true;
  66. }
  67. // 测试
  68. var fields = {
  69. 'ID': 1,'TOTAL': 1,'AVL' : 1,'NUM' : 1
  70. };
  71. // 提交到服务器端的字符串不应该包含空白符,或者应该禁止用户输入空白符
  72. alert( fn('ID*NUM+(TOTAL/AVL)*0.5',fields) );
  73. })();

猜你在找的正则表达式相关文章