我正在尝试构建一个jquery插件,找到excel公式并对其进行评估,目前使用jison作为解析器和一些正则表达式替换占位符,问题是我对这两个是盲目的,当前的完整代码在github
我想做什么:
假设我有一个注册的公式成员及其功能
var formula = {
member:['MAX','MIN','AVG','SUM'],
max:function(cell1,cell2){
...
//return the max
}
//.... and other function not listed
}
并拥有一个包含数据公式属性
的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))
提前致谢
答案 0 :(得分:1)
使用此正则表达式:
(SUM|AVG|MAX|MIN)\(([^(^)]*)\)
IF($B1 > 3,SUM($B4,$B5),MIN($B1,$B3))
匹配SUM($B4,$B5)
,MIN($B1,$B3)
,匹配的群组为$B4,$B5
,$B1,$B3
在您的代码中,修改以下行:
var $formula_regex = new RegExp('('+formula.member.join('|')+')\(([^(^)]*)\)','g');