2013-02-20 47 views
1

我正在開發一個使用JavaScript和PHP的分佈式計算器。計算器應該識別括號並根據括號改變計算順序。所有基本的數學運算(*/,+,-)具有相同的優先級(與普通優先級不同)。我使用下面的正則表達式來獲取用戶輸入並放入數組中。此正則表達式非常適用於正數:用Javascript開發計算器來檢測負數

/\d*\.\d+|\d+|[()/*+-]/g 

然而,當涉及到負數,它崩潰,因爲我使用遞歸替換功能替換每對括號(和內容)與結果這些括號內的操作。我這樣做是因爲這是一個分佈式計算器,我應該在服務器端執行每個原子操作,然後將結果返回並顯示在操作的歷史記錄中。

我只想檢測負數(將它們保存爲數組中的一個元素)。我認爲它應該以這種方式工作:當有兩個連續的操作符(它們之間有零個或多個空格字符),第二個操作符是一個減號(-)時,減號應連接到以下數字(如號碼的符號)。另外,如果第一個數字前面有一個減號,則該符號應連接到該數字。

回答

1

因爲在正則表達式的javascript實現中沒有後視效果,所以這看起來並不像看起來那麼直截了當。

這是做到這一點的一種方式。它假定空間先被剝離出來。

var m, 
    tokens = [], 
    rex = /(^|[(\/*+-])(-(?:\d*\.)?\d+)|[()\/*+-]|(?:\d*\.)?\d+/g, 
    str = '-4-(-2*3)--4-2/-0.9-3+(3-4*-4)'; 

while (m = rex.exec(str)) { 
    if (m[1]) { 
     tokens.push(m[1], m[2]); 
    } else { 
     tokens.push(m[0]); 
    } 
} 

console.log(tokens); 
// [ "-4", "-", "(", "-2", "*", "3", ")", "-", "-4", "-", "2", "/", "-0.9", "-", "3", "+", "(", "3", "-", "4", "*", "-4", ")" ] 

在這裏,使用捕獲組()模擬後視。如果在負數m[2]之前存在字符串^或運算符m[1]的開始,則運算符和負數分別被添加到數組中。否則,任何-作爲操作符被添加到數組中。

或者,你可以使用

tokens = str.match(/(?:\d*\.)?\d+|[()\/*+-]/g); 

,然後通過數組迭代,如果你發現一個-操作以下則預先考慮到以下號碼。

無論採用哪種方式,簡單的正則表達式都不會單獨標記字符串,您將需要使用條件語句來確定如何處理每個-

+0

感謝您的幫助。 – Metallica 2013-03-03 20:18:35