正则表达式不匹配数字

时间:2016-09-05 03:38:18

标签: javascript regex

我试图在字符串中解析数学。它适用于x * y但不适用于x*y*z。我认为它与一个字符串有关,而另一个是数字。但我无法找到解决问题的方法。

这是我的代码:

var reMD = /(\d+) *[\*|\/] *(\d+)/g
var str = '17 * 13 * 4';
var ex;
runWhile();

function runWhile() {
   var ex = reMD.exec(str);
   if (ex !== null) {
     if (ex.index === reMD.lastIndex) {
       reMD.lastIndex++;
     }
     if (ex[0].indexOf('*') !== -1) {
       var rep = parseInt(ex[1]) * parseInt(ex[2])
     } else {
       var rep = parseInt(ex[1]) / parseInt(ex[2])
     }
     var rep = rep.toString()
     str = str.replace(ex[0], rep)
     if (reMD.exec(str) !== null) {
       runWhile()
     }
   }
}
alert(str)

警报会发回221 * 4,但应该以{{1​​}}的形式返回。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您从正则表达式中删除g标记,它应该有效,因为每次调用.exec()时,它都将按照at MDN的说明重新开始。您还可以删除弄乱reMD.lastIndex

的代码

(使用g标志,它尝试匹配上一个匹配结束的索引,但是您尝试匹配新字符串。)

另请注意,您也可以更改正则表达式以匹配运算符,而不是使用indexOf(),并且您并非真的需要致电parseInt(),因为*/运营商会将他们的操作数强制转换为数字:



var reMD = /(\d+) *([\*|\/]) *(\d+)/
var str = '17 * 13 / 4';  // note I've change the input to demostrate * and /
runWhile();

function runWhile() {
   var ex = reMD.exec(str);
   if (ex !== null) {
     if (ex[2]==="*") {
       var rep = ex[1] * ex[3]
     } else {
       var rep = ex[1] / ex[3]
     }
     rep = rep.toString()
     str = str.replace(ex[0], rep)
     if (reMD.exec(str) !== null) {
       runWhile()
     }
   }
}
console.log(str)




(注意:对于使用和修改函数外部定义的变量的函数来说,它仍然有点不整洁,但我会留下任何进一步的整理作为读者的练习。 。)

答案 1 :(得分:0)

我不知道这是否足以满足您的项目需要但

'17 * 13 * 4'.replace(/(\d+)( *[\*|\/] *(\d+))*/g, eval)