Javascript Regex - 从列出的函数中删除参数

时间:2013-05-25 03:20:46

标签: javascript jquery regex excel

我正在尝试构建一个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))

提前致谢

1 个答案:

答案 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

regexpal

上进行测试

在您的代码中,修改以下行:

var $formula_regex  = new RegExp('('+formula.member.join('|')+')\(([^(^)]*)\)','g');