【问题标题】:Detecting negative numbers using Javascript for developing a calculator使用 Javascript 检测负数以开发计算器
【发布时间】:2013-02-05 21:15:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript regex calculator


    【解决方案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[2] 之前有字符串 ^ 或运算符 m[1] 的开头,则将运算符和负数分别添加到数组中。否则,任何- 都会作为运算符添加到数组中。

    或者,您可以使用

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2015-06-06
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多