我试图在字符串中解析数学。它适用于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}}的形式返回。我该如何解决这个问题?
答案 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)