Javascript正则expression式 – 从列出的函数中删除参数
我试图build立一个jQuery的插件,findExcel公式和评估它,目前使用jison作为parsing器和一些正则expression式的占位符replace,问题是我对这两个盲目,完整的代码目前在github
我想做的事:
说我有一个注册公式成员,它的function
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>
如果variables占位符$ A1作为列出的公式(MAX,MIN,SUM和AVG)的参数,它应该被replace为1.1(将A转换为1并与点连接),如果它在公式括号之外,则应该保留并将在稍后被replace(如果你可以帮助build立jison文件,使MAX()接受string,这将是伟大的:))
我目前的代码如下所示
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); });
以上的正则expression式工作如预期,当它包含像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))
提前致谢
使用这个正则expression式:
(SUM|AVG|MAX|MIN)\(([^(^)]*)\)
IF($B1 > 3,SUM($B4,$B5),MIN($B1,$B3))
与SUM($B4,$B5)
, MIN($B1,$B3)
匹配, $B4,$B5
, $B1,$B3
testing正则expression式
在你的代码中,修改这一行:
var $formula_regex = new RegExp('('+formula.member.join('|')+')\(([^(^)]*)\)','g');