2013-10-04 42 views
0

我有一個表達說

日誌(1,3)+ 4,5 + MAX(7,8,9)

其中逗號使用了兩種方式。

1-在「log(1,3)+4,5」逗號用於代替點(。)或小數點符號.i.e. 「log(1,3)+4,5」相當於「log(1.3)+4.5」

2-最大(7,8,9)它被用作數字分隔符。即這個結果是9;最大數量。

我的問題是替換逗號;它被用作小數分隔符;用小數點但這不應該影響最大值(7,8,9)。即我需要上述表達式轉換爲

日誌(1.3)+ 4.5 + MAX(7,8,9)

我tried-

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 ($`) { 

如果是的話那怎麼樣?

+0

這個「表情」來自哪裏?在德國 – Brewal

+0

我們使用逗號代替dot.So這裏我們想提供有限的逗號支持作爲小數點。 – virus

+0

是的,我是法國人,我們也是。我的意思是,這是一個來自輸入或字符串的字符串嗎? – Brewal

回答

1

您的語言不清。

max(8,1,8,2) 

這是否迴歸88,18,2

你的語言也看不到定期,所以你不能用正則表達式解析它,你需要的上下文。如果這樣的事情是正確的:

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

假設你可以擺脫不確定性的,你可以寫一個解析器做上下文檢測。

+0

So max(8,1,8,2)==> 8 max(1,max(2,3))==> 3 請閱讀「In max(7,8,9)」作爲數字分隔符,即這個結果是9;最大數字。「 – virus

0

請使用Javascript嘗試以下操作。希望這可以幫助你在邏輯上。

DEMO HERE

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)

+0

我只想在javascript解決方案。謝謝 – virus

+1

哪裏OP的建議標籤包含'php'? – Jai

+0

@virus,我用javascript編寫了代碼。覈實。 –

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 Demo

此功能目前與多個max功能,但只有+-跡象。它可以通過改進*/以及更多...你將不得不尋找好的正則表達式。