计算器正则表达式小数

计算器正则表达式小数

问题描述:

我想有一个正则表达式,可以在一个简单的计算器工作:计算器正则表达式小数

现在我有: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

试试这个

/ *(\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和正则表达式没有得到表达的力量来掩盖。

所以,我的正则表达式只是一个非常特别的建议你的情况。你可以肯定会进一步改善它。

+0

你至少需要逃避'+',当然这只适用于一个特定的例子; 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 

做同样的你需要乘,除其他二元运算等

+0

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

+0

取决于你的符号。如果您想允许追踪期间,请替换(?:\。\ 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 */