0

我有一个表情说

对数(1,3)+4,5+最大(7,8,9)

逗号有两种使用方式。

1- 在"log(1,3)+4,5"中使用逗号代替点 (.) 或十进制符号。即 " log(1,3)+4,5"等同于 " log(1.3 )+4.5"

2- 在 max(7,8,9) 中,它被用作数字分隔符。即 this 的结果是 9 ;最大数量。

我的问题是用逗号代替;用作小数分隔符;使用小数,但这不应该影响 max(7,8,9)。即我需要将上面的表达式转换为

对数(1.3)+4.5+最大值(7,8,9)

我试过的-

function substitute(expr) {
    expr.replace(/,/g, function ($`) {
        /*some processing here to decide whether comma to be substituted with dot or not.On that basis I will return either dot or comma.*/
    }

但是如何将 $` 值传递给关联函数或者是否可以在 javascript 中执行此操作。

expr.replace(/,/g,function ($`) {

如果是,那怎么办?

4

3 回答 3

1

你的语言模棱两可。

max(8,1,8,2)

这是返回88,1还是8,2

你的语言看起来也不规则,所以你不能用正则表达式解析它,你需要上下文。如果允许这样的事情:

max(1,max(2,3)) // 3?

假设您可以摆脱歧义,您可以编写一个解析器来进行上下文检测。

于 2013-10-04T10:02:51.853 回答
0

这可能是一个解决方案:

function myFilter(string) {
    // save all functions and signs 
    var functions = [];
    var regExp = /[+,-]max\(([^\)]+)\)/;
    matches = true;
    while (matches !== null) {
        var matches = regExp.exec(string);
        if (matches !== null) {
            functions.push(matches[0]);
            string = string.replace(matches[0], '');
        }
    }
    // replace all remaining commas with dots
    string = string.replace(/,/g , ".");
    for (i in functions) {
        string += functions[i];
    }

    return string;
}

var s = '1,3+4,5+max(7,8,9)-max(2,3,5)';
var filteredString = myFilter(s);

jsFiddle 演示

这目前适用于多种max功能,但仅适用于+-标志。它可以通过*,/等等来改进……你必须找到好的正则表达式。

于 2013-10-04T10:41:49.790 回答
0

使用 Javascript 尝试以下操作。希望这对您的逻辑有所帮助。

在这里演示

var value = "log(1,3)-4,5+max(7,8,9)";
var val = '';

var splitValue, appendSym;
if (value.indexOf("+") != -1)
{
    splitValue = value.split("+");
    appendSym = "+";
}
else if(value.indexOf("-") != -1)
{
    splitValue = value.split("-");
    appendSym = "-";
}
else if(value.indexOf("*") != -1)
{
    splitValue = value.split("*");
    appendSym = "*";
}
else
{
    splitValue = value.split("/");
    appendSym = "/";
}

var length = splitValue.length;

for (var i = 0; i < length; i++) {
  if (val) val += appendSym;
    var strrep = splitValue[i].replace(/,/g,".");
    if (splitValue[i].indexOf("max") != -1 || splitValue[i].indexOf("min") != -1)
    {
        val+=splitValue[i];
    }
    else
    {
        val+=strrep;
    }
}

alert(val);

上述代码的输出是log(1.3)-4.5+max(7,8,9)

于 2013-10-04T10:12:32.760 回答