我想有一個正則表達式,可以在一個簡單的計算器工作:計算器正則表達式小數
現在我有:this.field.value.match(/\./))
我的問題是,我只能一次插入一個小數:
例如: 2.5 + 2 OR 3 + 3.55
我想利可以選擇添加2.5 + 2.5。問題是,我試圖阻止別人打字2.5.5.5 + 5
我想有一個正則表達式,可以在一個簡單的計算器工作:計算器正則表達式小數
現在我有:this.field.value.match(/\./))
我的問題是,我只能一次插入一個小數:
例如: 2.5 + 2 OR 3 + 3.55
我想利可以選擇添加2.5 + 2.5。問題是,我試圖阻止別人打字2.5.5.5 + 5
試試這個
/ *(\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.5 + 2.5
,你可以使用:
/[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/
無論如何,請記住,正則表達式不能完全解析算術表達式,因爲它是一個context free grammar和正則表達式沒有得到表達的力量來掩蓋。
所以,我的正則表達式只是一個非常特別的建議你的情況。你可以肯定會進一步改善它。
你至少需要逃避'+',當然這隻適用於一個特定的例子; JREAM想要一個「簡單的計算器」... – 2011-05-30 14:46:03
\d*(?:\.\d)?\d*\s*\+\s*\d*(?:\.\d)?\d*
匹配
12+2.4
.34 +2
12.34 + .34
但不匹配
12.34.2 + 2
12.+3
做同樣的你需要乘,除其他二元運算等
'12.'與'12.0'相同,所以它是一個有效的輸入。 – Midas 2011-05-30 14:51:44
取決於你的符號。如果您想允許追蹤期間,請替換(?:\。\ d)?與\。? – Hyperboreus 2011-05-30 14:53:56
好,如果你做一個簡單的計算器,你必須更好地爲你定義什麼簡單的方法。爲了我。這意味着您支持標準操作(+
,-
,/
,*
),括號()
整數和浮點數。
解決方法是:沒有簡單的方法!我的建議:評估它,你必須解析它:減少每個「數字」的支票很容易(\d+|\d*\.\d+)
,但檢查整個結構是困難的一個正則表達式(這意味着,你會最終得到一些超級複雜每個新角落案件)
另一個簡單的解決方案:檢查它是否沒有太冒險(例如匹配^[\d.+*/()]*$
)並嘗試使用eval
。
如果你簡單的比我的更簡單,你可能會發現一個正則表達式,但是這絕對不是最好的路徑(這有點ILKE試圖用正則表達式來解析HTML:你需要一個上下文分析器)
如何:
/^\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)
我想你可能會以這種錯誤的方式去做。而不是試圖以正則表達式可接受的條目的每一個可能的組合,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 */
如果它是一個計算器,您還需要處理的事情,比如'0.1 - (1.2 + 3.4)+ -5.6e-7'。括號可以是嵌套的,並且有一元運算符,使得正則表達式成爲不適當的工具,就像使用正則表達式解析html不合適一樣。 – 2011-05-30 15:14:36