使用Javascript检测负数以开发计算器

时间:2013-02-20 18:21:58

标签: javascript regex calculator

我正在使用JavaScript和PHP开发分布式计算器。计算器应识别括号,并应根据括号更改计算顺序。所有基本数学运算(*/+-)具有相同的优先级(与公共优先级不同)。我使用以下正则表达式来获取用户输入并放入一个数组。这个正则表达式适用于正数:

/\d*\.\d+|\d+|[()/*+-]/g

然而,当涉及负数时,它会崩溃,因为我使用递归替换函数将每对括号(和内容)替换为这些括号内的操作结果。我这样做是因为这是一个分布式计算器,我应该在服务器端执行每个原子操作,然后返回结果并在操作历史中显示它。

我想要的只是检测负数(将它们保存为数组中只有一个元素)。我认为它应该以这种方式工作:当有两个连续的运算符(它们之间有零个或多个空格字符),而第二个运算符是减号(-)时,减号应该连接到以下号码(作为号码的标志)。此外,如果第一个数字前面带有减号,则该符号应该连接到该数字。

1 个答案:

答案 0 :(得分:1)

因为javascript的正则表达式的实现没有后视,所以这并不像最初看起来那么简单。

这是一种做法。它假设首先剥离了空格。

var m,
    tokens = [],
    rex = /(^|[(\/*+-])(-(?:\d*\.)?\d+)|[()\/*+-]|(?:\d*\.)?\d+/g,
    str = '-4-(-2*3)--4-2/-0.9-3+(3-4*-4)';

while ( m = rex.exec( str ) ) {
    if ( m[1] ) {
        tokens.push( m[1], m[2] );
    } else {
        tokens.push( m[0] );
    }
}

console.log( tokens );
// [ "-4", "-", "(", "-2", "*", "3", ")", "-", "-4", "-", "2", "/", "-0.9", "-", "3", "+", "(", "3", "-", "4", "*", "-4", ")" ]

此处,使用捕获组()模拟后视。如果在负数^之前存在字符串m[1]或运算符m[2]的开头,则将运算符和负数分别添加到数组中。否则,任何-都将作为运算符添加到数组中。

或者,您可以使用

tokens = str.match( /(?:\d*\.)?\d+|[()\/*+-]/g );

然后遍历数组,如果在运算符后面找到-,则将其添加到以下数字。

无论您采用哪种方式,简单的正则表达式都不会单独标记字符串,您需要使用条件语句来确定如何处理每个-