我正在尝试构建一个 jquery 插件来定位 excel 公式并对其进行评估,目前使用jison作为解析器和一些正则表达式来替换占位符,问题是我对这两个视而不见,目前完整的代码在github
我想做的事:
假设我有一个注册的公式成员,它的功能
var formula = {
member:['MAX','MIN','AVG','SUM'],
max:function(cell1,cell2){
...
//return the max
}
//.... and other function not listed
}
并有一个带有 data-formula 属性的 HTML 元素
<div data-formula="MAX($A1,$A5)"></div>
如果变量占位符 $A1 充当列出公式(MAX、MIN、SUM 和 AVG)的参数,则应将其替换为 1.1(将 A 转换为 1 并与点连接),如果它在公式括号之外,则应保持不变并且稍后将被替换(如果您可以帮助构建使 MAX() 接受字符串的 jison 文件,那就太好了:))
我当前的代码如下所示
var $equation = '';
var $formula_regex = new RegExp('['+formula.member.join('|')+']+\(([^]+)\)','g');
//should be [SUM|AVG|MAX|MIN]+\(([^]+)\)
//this.data[$key].formula contains the string formula
$equation = this.data[$key].formula.replace($formula_regex,function($range){
$range = $range.replace(/\$\w+/g, function($key) {
$key = $key.replace('$','');
//utility.translaceCell will convert B23 to 2.23, C2 to 3.2 etc
$key = utility.translateCell($key,'string');
return $key;
});
return($range);
});
当上面的正则表达式包含像 MAX($B1,$B3) 这样的单个公式时,它按预期工作
MAX($B1,$B3)
//translated to MAX(2.1,2.3)
但在包含更复杂的公式时不起作用
IF($B1 > 3,SUM($B1,$B3),MIN($B1,$B3))
//translated to IF(2.1 > 3,SUM(2.1,2.3),MIN(2.1,2.3))
//expected IF($B1 > 3,SUM(2.1,2.3),MIN(2.1,2.3))
提前致谢