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

标签 javascript regex calculator

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

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

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

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

最佳答案

因为 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 );

然后遍历数组,如果您发现运算符后面有 -,则将其添加到后面的数字前面。

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

关于javascript - 使用 Javascript 检测负数以开发计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987158/

相关文章:

javascript - 使用javascript自动最小化窗口 - jquery

java - 为什么在针对 XSS 攻击模式进行验证时,非常大的字符串会抛出 java.lang.StackOverflow 异常

c# - 解析变量 URI(RegEx、Uri、字符串函数?)c#

regex - 如何从 requests.get().text 中排除换行符

python - Tkinter 计算器错误

javascript - 在 Javascript 文件中获取 Visual Studio 2010 中的智能感知

javascript - 如何执行对 REST api 的异步 axios 调用并更新商店(redux thunk 令人困惑)?

javascript - promise 是如何创建的?

java - 如果 double 是整数,不显示小数?

c# - 试图用C#制作计算器。这是怎么了?