Calculator Regex Decimal

Calculator Regex Decimal

本文关键字:Decimal Regex Calculator      更新时间:2023-09-26

我想要一个可以在简单计算器中工作的正则表达式:

现在我有:this.field.value.match(/'./))

我的问题是一次只能插入一个小数:

例如:2.5+2OR3+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]*/

无论如何,请记住,regex不能完全解析算术表达式,因为它是一种上下文无关的语法,而regex没有足够的表达能力来覆盖这一点。

因此,我的正则表达式只是针对您的情况提出的一个非常特别的建议。你肯定可以进一步改进它。

'd*(?:'.'d)?'d*'s*'+'s*'d*(?:'.'d)?'d*

匹配

12+2.4
.34 +2
12.34 + .34

但与不匹配

12.34.2 + 2
12.+3

对乘法、除法等所需的其他二进制运算符也执行相同操作。

怎么样:

/^'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)

我认为你可能做得不对。与其尝试正则化所有可能的可接受条目组合,不如确保输入仅包含有效字符,然后尝试计算一个值:

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 */

好吧,如果你做一个简单的计算器,你必须更好地定义简单对你来说意味着什么。对我来说,这意味着您支持标准运算(+-/*)、括号()整数和浮点运算。

解决办法是:没有简单的方法!我的建议是:要评估它,你必须解析它:将每个"数字"减少为一个检查很容易('d+|'d*'.'d+),但用正则表达式检查整个结构很难(这意味着,你每次都会得到一些超级复杂的东西和新的角落案例)

另一个简单的解决方案是:检查它是否风险不大(例如,与^['d.+*/()]*$匹配),并尝试计算eval

如果你的简单比我的简单,你可能会找到一个正则表达式,但这绝对不是最好的路径(用正则表达式解析html有点像:你需要一个上下文解析器)