Javascript 将算术表达式拆分为多个部分的正则表达式

Javascript 将算术表达式拆分为多个部分的正则表达式,javascript,jquery,regex,Javascript,Jquery,Regex,我正在创建一个计算器,其中我从输入字段中获取字符串。例如,该字符串可以是2+3*9/3-6 现在我想先执行乘法和除法运算, 因此,我将得到2+9-6,其中9将是更高优先级操作的答案 到目前为止,我已经做到了这一点。这是一个完整的功能: function calculateResult(){ var higher = /(\d+[*\/]\d+)/g; calstr = $('#input-display').val(); var m = '*'; var res

我正在创建一个计算器,其中我从输入字段中获取字符串。例如,该字符串可以是
2+3*9/3-6

现在我想先执行乘法和除法运算, 因此,我将得到
2+9-6
,其中
9
将是更高优先级操作的答案

到目前为止,我已经做到了这一点。这是一个完整的功能:

function calculateResult(){
    var higher = /(\d+[*\/]\d+)/g;
    calstr = $('#input-display').val();
    var m = '*';
    var res = calstr.split(higher);
    console.log(res.length+ ' : ' + res);
    // console.log(res);
    if(res.length > 2){
        console.log('split success');
        var index = 0;
        do{
            for(var i = 1; i < res.length; i+=2){
                var a = res[i].split(/([0-9\.]+)/g);
                console.log('before calculation : '+calstr);
                var regex = RegExp('(?:.*?(\\d+[*\/]\\d+)){' + i + '}');
                console.log('regex generated : '+regex);
                if(a[2] == '*'){
                    calstr = calstr.replace(regex , Number(a[1])*Number(a[3]));
                }
                else if(a[2] == '/'){
                    calstr = calstr.replace(regex , Number(a[1])/Number(a[3]));
                }
                console.log('replaced result : ' + calstr);
                console.log('replaced result at : ' + calstr.search(regex));
            }
            // console.log('result : ' + calstr);
            console.log('multiplication complete');
            res = calstr.split(higher);
            console.log('result is : '+res);
        }while(res.length > 2);
    }
    else if(res.length == 1)
        console.log('split failed');
}
函数calculateResult(){
var较高=/(\d+[*\/]\d+)/g;
calstr=$(“#输入显示”).val();
var m='*';
var res=计算分割(更高);
console.log(res.length+':'+res);
//控制台日志(res);
如果(分辨率长度>2){
console.log('splitsuccess');
var指数=0;
做{
对于(变量i=1;i2);
}
else if(res.length==1)
console.log('splitfailed');
}
当我尝试替换字符串中的结果时,替换成功。但是在一些输入上,它替换了作为参数传递给这个函数的整个字符串,这不是我想要的

我做错了什么

如果还有什么不清楚的地方,我很乐意澄清


在乘法和除法顺利运行之后,我计划更改这些正则表达式,以增加对加法和减法的支持。它将使用相同的代码,但下一次运行较低优先级的运算符。

似乎是您的第一个正则表达式
var higher=/(\d+[*\/]\d+)/g未从2+3*9/3-6(签入)检索“3*9/3”

尝试将其更改为

var higher = /(\d[^\+\-]*)+/g;

似乎您的第一个正则表达式
var higher=/(\d+[*\/]\d+)/g未从2+3*9/3-6(签入)检索“3*9/3”

尝试将其更改为

var higher = /(\d[^\+\-]*)+/g;

此正则表达式是您得到错误结果的原因:

RegExp('(?:.*?(\\d+[*\/]\\d+)){' + i + '}');
它不应与
*?
匹配,因为这将使您删除后面的
替换
中所有前面的字符

此外,不需要单个
\
。如果您真的想为正则表达式转义
/
,则必须将前面的反斜杠加倍,因为它还需要在带引号的字符串中转义。但是,由于正斜杠不出现在正则表达式文本中(如
/…/g
),因此它根本不需要转义

{'+i+}
部分没有用处。这只需要一个模式出现那么多次,但在已经进行了多次替换之后,这可能是错误的。事实上,每次都需要匹配第一个匹配项,因为之前的所有匹配项都已替换

所以应该是这样的:

    RegExp('(\\d+[*/]\\d+)');
。。。因此,它实际上与
更高的
正则表达式没有什么不同,除了全局修饰符。但是
higher
上的全局修饰符是不必要的,因为
split
无论如何都会搜索所有出现的情况,即使没有该修饰符。这意味着您实际上只需要
higher
(不需要
g
),而不需要上面的正则表达式

还有一些需要改进的地方:

  • 以下调试行没有多大用处,因为calstr已被修改,而regex是在修改之前应用的:

    console.log('replaced result at : ' + calstr.search(regex));
    
  • 最好不要访问函数内的输入元素
    input display
    。而是将
    calstr
    作为函数参数传递。这使得它独立于浏览器上下文

  • 数字(…)
    可以用酉加号(
    +
    )缩短

  • 下面是更新后的代码,它还实现了
    +
    -
    处理,将整个过程放入另一个循环中,该循环有3个迭代:一个用于
    *
    /
    ,另两个用于
    -
    (必须在
    +
    之前)和
    +
    。这还有另一个复杂性:一元负号不应与正常负号运算符混淆。您将在内部正则表达式中看到使用
    (?:^-?
    管理的

    函数计算结果(calstr){
    对于(变量级别=0;级别<3;级别++){
    var search=level==0?'(\\d+[*/]\\d+)
    :级别==1?'(?\\d+-\\d+)
    :“(?\\d++\\+\\d+”;
    var较高=RegExp(搜索);
    var res=计算分割(更高);
    而(分辨率长度>2){
    对于(变量i=1;i
    
    
    计算

    结果:
    此正则表达式是您得到错误结果的原因:

    RegExp('(?:.*?(\\d+[*\/]\\d+)){' + i + '}');
    
    不应该