1

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

提前致谢

4

1 回答 1

1

使用这个正则表达式:

(SUM|AVG|MAX|MIN)\(([^(^)]*)\)

WithIF($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');
于 2013-05-25T03:51:26.000 回答