计算器正则表达式小数
我想有一个正则表达式,可以在一个简单的计算器工作:计算器正则表达式小数
现在我有: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