我想要一个可以在一个简单的计算器中使用的正则表达式:
现在我有:this.field.value.match(/\./))
我的问题是我一次只能插入一个小数:
例如: 2.5 + 2 或 3 + 3.55
我希望能够选择添加2.5 + 2.5。关键是,我试图阻止某人输入2.5.5.5 + 5
答案 0 :(得分:2)
对于2.5 + 2.5
,您可以使用:
/[0-9]\+\.?[0-9]* + [0-9]\+\.?[0-9]*/
无论如何,请记住,正则表达式无法完全解析算术表达式,因为它是context free grammar并且正则表达式没有表达能力来覆盖它。
所以,我的正则表达式只是对你的案例的一个非常特别的建议。你可以肯定会进一步改进它。
答案 1 :(得分:2)
试试这个
/ *(\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 :(得分:1)
\d*(?:\.\d)?\d*\s*\+\s*\d*(?:\.\d)?\d*
匹配
12+2.4
.34 +2
12.34 + .34
但不匹配
12.34.2 + 2
12.+3
对乘法,除法等所需的其他二元运算符执行相同的操作。
答案 3 :(得分:1)
怎么样:
/^\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)
答案 4 :(得分:1)
我想你可能会以错误的方式解决这个问题。 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 */
答案 5 :(得分:0)
好吧,如果你做一个简单的计算器,你必须更好地定义什么是简单的方法。为了我。这意味着您支持标准操作(+
,-
,/
,*
),括号()
整数和浮点数。
解决方案是:没有简单的方法!我的建议:要评估它,你将不得不解析它:将每个“数字”减少到一个检查很容易(\d+|\d*\.\d+)
,但检查整个结构很难用正则表达式(意思是,你最终会得到每次超级复杂和新的角落案例)
另一个简单的解决方案:检查它是否风险太大(例如匹配^[\d.+*/()]*$
)并尝试eval
- 使用它。
如果你的简单比我的简单,你可能会找到一个正则表达式,但这肯定不是最好的路径(尝试用正则表达式解析html有点蠢:你需要一个上下文解析器)