Javascript 计算器正则十进制

Javascript 计算器正则十进制,javascript,regex,Javascript,Regex,我想要一个可以在简单计算器中工作的正则表达式: 现在我有:this.field.value.match(/\./) 我的问题是一次只能插入一个小数: 例如: 2.5+2或 3+3.55 我希望能够有选择地添加2.5+2.5。重点是,我试图阻止某人为2.5+2.5键入2.5.5+5,您可以使用: /[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/ 无论如何,请记住,正则表达式不能完全解析算术表达式,因为它是一个表达式,而正则表达式没有足够的表达能力来解决这个问题 所以,我

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

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

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

例如: 2.5+23+3.55


我希望能够有选择地添加2.5+2.5。重点是,我试图阻止某人为
2.5+2.5
键入2.5.5+5

,您可以使用:

/[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/
无论如何,请记住,正则表达式不能完全解析算术表达式,因为它是一个表达式,而正则表达式没有足够的表达能力来解决这个问题


所以,我的正则表达式只是一个非常特别的建议。您当然可以进一步改进它。

对于
2.5+2.5
,您可以使用:

/[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/
\d*(?:\.\d)?\d*\s*\+\s*\d*(?:\.\d)?\d*
无论如何,请记住,正则表达式不能完全解析算术表达式,因为它是一个表达式,而正则表达式没有足够的表达能力来解决这个问题

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

\d*(?:\.\d)?\d*\s*\+\s*\d*(?:\.\d)?\d*
火柴

12+2.4
.34 +2
12.34 + .34
但并不匹配

12.34.2 + 2
12.+3
对乘法、除法等所需的其他二进制运算符执行相同的操作

火柴

12+2.4
.34 +2
12.34 + .34
但并不匹配

12.34.2 + 2
12.+3

对乘法、除法等所需的其他二进制运算符也要这样做。

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

解决办法是:没有简单的方法!我的建议是:要评估它,你必须解析它:将每个“数字”减少为一个检查很容易
(\d+\d*\.\d+)
,但用正则表达式检查整个结构很难(这意味着,你每次都会遇到一些非常复杂的新情况)

另一个简单的解决方案:检查它是否太危险(例如匹配
^[\d.+*/()]*$
),并尝试
评估它


如果你的simple比我的简单,你可能会找到一个regex,但这绝对不是最好的方法(这有点像用regex解析html:你需要一个上下文解析器)

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

解决办法是:没有简单的方法!我的建议是:要评估它,你必须解析它:将每个“数字”减少为一个检查很容易
(\d+\d*\.\d+)
,但用正则表达式检查整个结构很难(这意味着,你每次都会遇到一些非常复杂的新情况)

另一个简单的解决方案:检查它是否太危险(例如匹配
^[\d.+*/()]*$
),并尝试
评估它

如果你的simple比我的简单,你可能会找到一个regex,但这绝对不是最好的方法(这有点像用regex解析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)
那么:

/^\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)
试试这个

/ *(\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. +
等等

还匹配输入开始和结束时+号和之间的空格。

试试这个

/ *(\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. +
等等


还匹配输入开始和结束时+号和之间的空格。

我认为您可能用了错误的方法。与其尝试对所有可能的可接受项组合进行正则化,不如确保输入仅包含有效字符,然后尝试计算一个值:

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

我想你可能走错了方向。与其尝试对所有可能的可接受项组合进行正则化,不如确保输入仅包含有效字符,然后尝试计算一个值:

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

您至少需要转义
+
,当然这只适用于一个特定的示例;JREAM想要一个“简单的计算器”…您至少需要转义
+
,当然这只适用于一个特定的例子;JREAM需要一个“简单计算器”…
12。
12.0
相同,因此它是一个有效的输入。具体取决于您的符号。如果要允许尾随句点,请替换(?:\。\d)?带\.?
12。
12.0
相同,因此它是有效的输入。具体取决于您的符号。如果要允许尾随句点,请替换(?:\。\d)?使用\.?如果是计算器,您还需要处理
0.1-(1.2+3.4)+-5.6e-7
之类的内容。括号可以嵌套,并且有一元运算符,这使得正则表达式不适合用于此目的,就像不适合使用正则表达式解析html一样。如果它是计算器,您还需要处理
0.1-(1.2+3.4)+-5.6e-7
之类的事情。括号可以嵌套,并且有一元运算符,这使得regex成为一个不合适的工具,就像使用正则表达式解析html不合适一样。