如何使用正则表达式进行javascript计算器输入?

如何使用正则表达式进行javascript计算器输入?,javascript,regex,Javascript,Regex,我正在尝试用JavaScript编写简单的计算器。我想检查用户输入是否正确。我编写正则表达式是为了确保用户输入正确,但它不起作用。我想做的是一个简单的规则,即运算符(/*-+)后面应该跟操作数(0-9),但第一个运算符可以是-或+。下面的正则表达式不起作用。我犯了什么错 ^[-+]?[0-9]{0,}([-+*/]?)[0-9]+$ 表达式查找可选的-或+,后跟零或更多数字([0-9]{0,})。我想您可能想要一个或多个(+)。类似地,([-+*/])中的?使运算符成为可选的。您可能还希望捕获

我正在尝试用JavaScript编写简单的计算器。我想检查用户输入是否正确。我编写正则表达式是为了确保用户输入正确,但它不起作用。我想做的是一个简单的规则,即运算符(/*-+)后面应该跟操作数(0-9),但第一个运算符可以是-或+。下面的正则表达式不起作用。我犯了什么错

^[-+]?[0-9]{0,}([-+*/]?)[0-9]+$

表达式查找可选的
-
+
,后跟零或更多数字(
[0-9]{0,}
)。我想您可能想要一个或多个(
+
)。类似地,
([-+*/])
中的
使运算符成为可选的。您可能还希望捕获各个部分


当我在两个操作数之间有一个操作符时,这是可以的,但当我做9+9+9时,它就不起作用了

如果您想允许后面有其他运算符和数字,则必须允许后面的部分重复

以下是我的粗略估计:

^\s*([-+]?)(\d+)(?:\s*([-+*\/])\s*((?:\s[-+])?\d+)\s*)+$
(但是如果你有三个或更多的术语,那么捕获组就有一些不太正确的事情发生。)

我所做的改变:

  • 使用
    \d
    而不是
    [0-9]
    \d
    代表“数字”)

  • 将数字和运算符放入捕获组中

  • 不要将数字或运算符设置为可选

  • 允许在不同的位置使用可选的空白(
    \s*

  • (?:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

  • 允许在第二组数字前面加一个
    -
    +
    ,但前提是在运算符后面加一个空格

  • 是正确的,但是

    [0-9]{0,}
    
    不是,您需要+量词,就像您使用{0,}(与*)一样,您可以使“+*9”是正确的。 那么

    是错误的,您需要:

    ([-+*/]+[-+]?[0-9]+)*
    
    例如*-523+4234/-34(可以对负数或正数使用操作数,也可以对非精确数使用操作数,这意味着明显的正数)

    最后,你会有这样的想法:

    ^[-+]?[0-9]+([-+*/]+[-+]?[0-9]+)*$
    

    当然,您可以将类[0-9]替换为\d

    不要将正则表达式混合到计算器中。不要这样做。@Jon:考虑到操作列表的限制,这很好。@hm:“不工作”不是一个有用的问题描述。什么输入没有达到您期望的效果?
    {0,}
    看起来不对,请尝试使用
    +
    来代替。当我在两个操作数之间有一个运算符时,这很好,但当我执行9+9+9时,它就不起作用了。如果在第二个
    \d
    之前没有第二个
    ([-+])
    需要第二个
    \d
    @Victory:是的,我同意。
    (?:_____)
    中的捕获组也有一些问题,我还没有弄清楚。@t.J.Crowder:当输入为9+9/-9时,它不工作。使用Victory更新的版本可以正常工作。感谢you@hrn:是的,尽管您可能希望在操作符之后(我在上面做的就是这样做)在靠近末尾的
    -
    之前需要一个空格。否则会出现类似于
    --
    的情况,这可能会令人困惑。我还没有弄清楚抓捕小组到底出了什么问题,但你并没有说你想要他们,所以如果这对你有用,那就太好了。我没时间了(这里很晚了)。:-)@T.J.克劳德:对不起,我弄糊涂了(:我已经试了两个小时了。它对我有用。再次感谢。
    ([-+*/]+[-+]?[0-9]+)*
    
    ^[-+]?[0-9]+([-+*/]+[-+]?[0-9]+)*$