2011-05-30 106 views
1

我想有一個正則表達式,可以在一個簡單的計算器工作:計算器正則表達式小數

現在我有:this.field.value.match(/\./))

我的問題是,我只能一次插入一個小數:

例如: 2.5 + 2 OR 3 + 3.55

我想利可以選擇添加2.5 + 2.5。問題是,我試圖阻止別人打字2.5.5.5 + 5

+1

如果它是一個計算器,您還需要處理的事情,比如'0.1 - (1.2 + 3.4)+ -5.6e-7'。括號可以是嵌套的,並且有一元運算符,使得正則表達式成爲不適當的工具,就像使用正則表達式解析html不合適一樣。 – 2011-05-30 15:14:36

回答

2

試試這個

/ *(\d+\.?\d*|\d*\.?\d+) *\+ *(\d+\.?\d*|\d*\.?\d+) */ 

匹配

1 + 1 
1.0 + 1.0 
1. + 1. 
0.1 + 0.1 
.1 + .1 

等。

不匹配

. + . 
1 + 
.1 + 
1. + 

等等...

而且匹配+號之間並開始和輸入結束的空白。

2

對於2.5 + 2.5,你可以使用:

/[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/ 

無論如何,請記住,正則表達式不能完全解析算術表達式,因爲它是一個context free grammar和正則表達式沒有得到表達的力量來掩蓋。

所以,我的正則表達式只是一個非常特別的建議你的情況。你可以肯定會進一步改善它。

+0

你至少需要逃避'+',當然這隻適用於一個特定的例子; JREAM想要一個「簡單的計算器」... – 2011-05-30 14:46:03

1
\d*(?:\.\d)?\d*\s*\+\s*\d*(?:\.\d)?\d* 

匹配

12+2.4 
.34 +2 
12.34 + .34 

但不匹配

12.34.2 + 2 
12.+3 

做同樣的你需要乘,除其他二元運算等

+0

'12.'與'12.0'相同,所以它是一個有效的輸入。 – Midas 2011-05-30 14:51:44

+0

取決於你的符號。如果您想允許追蹤期間,請替換(?:\。\ d)?與\。? – Hyperboreus 2011-05-30 14:53:56

0

好,如果你做一個簡單的計算器,你必須更好地爲你定義什麼簡單的方法。爲了我。這意味着您支持標準操作(+,-,/,*),括號()整數和浮點數。

解決方法是:沒有簡單的方法!我的建議:評估它,你必須解析它:減少每個「數字」的支票很容易(\d+|\d*\.\d+),但檢查整個結構是困難的一個正則表達式(這意味着,你會最終得到一些超級複雜每個新角落案件)

另一個簡單的解決方案:檢查它是否沒有太冒險(例如匹配^[\d.+*/()]*$)並嘗試使用eval

如果你簡單的比我的更簡單,你可能會發現一個正則表達式,但是這絕對不是最好的路徑(這有點ILKE試圖用正則表達式來解析HTML:你需要一個上下文分析器)

1

如何:

/^\s*([+-]?(?:\d+\.?\d*|\d*\.\d+))\s*([-+\/*])\s*([+-]?(?:\d+\.?\d*|\d*\.\d+))\s*$/ 
    ^--------- group 1 ---------^ ^group2^ ^--------- group 3 ---------^ 

捕獲組:

group 1 will contain the first operand (maybe signed) 
group 2 will contain the operator (-,+,/,*) 
group 3 will contain the second operand (maybe signed) 
1

我想你可能會以這種錯誤的方式去做。而不是試圖以正則表達式可接受的條目的每一個可能的組合,JUSE確保輸入包含唯一有效的字符,然後嘗試計算值:

var result; 
if(/^[0-9+\-()^*/ .]+$/.test(this.field.value)) 
    try{result=new Function("return "+s+";")();}catch(e){}; 
if(result==undefined) /* there is a problem */ else /* OK */