我正在使用JavaScript和PHP开发分布式计算器。计算器应识别括号,并应根据括号更改计算顺序。所有基本数学运算(*
,/
,+
,-
)具有相同的优先级(与公共优先级不同)。我使用以下正则表达式来获取用户输入并放入一个数组。这个正则表达式适用于正数:
/\d*\.\d+|\d+|[()/*+-]/g
然而,当涉及负数时,它会崩溃,因为我使用递归替换函数将每对括号(和内容)替换为这些括号内的操作结果。我这样做是因为这是一个分布式计算器,我应该在服务器端执行每个原子操作,然后返回结果并在操作历史中显示它。
我想要的只是检测负数(将它们保存为数组中只有一个元素)。我认为它应该以这种方式工作:当有两个连续的运算符(它们之间有零个或多个空格字符),而第二个运算符是减号(-
)时,减号应该连接到以下号码(作为号码的标志)。此外,如果第一个数字前面带有减号,则该符号应该连接到该数字。
答案 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 );
然后遍历数组,如果在运算符后面找到-
,则将其添加到以下数字。
无论您采用哪种方式,简单的正则表达式都不会单独标记字符串,您需要使用条件语句来确定如何处理每个-
。