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 + '}');
不应该