我正在尝试制作一个简单的脚本来计算阶乘。因此,例如,如果输入“ 2!+5!+4”,您将得到“ 2 + 120 + 4”。我不知道你会怎么做。
WebAuthentication
答案 0 :(得分:4)
只需用\d+
部分(应分组)的阶乘结果替换!
后跟\d+
的所有出现:
var result = mathString.replace(/(\d+)!/g, function(match, number) {
return factorial(+number);
});
使用箭头功能缩小:
var result = mathString.replace(/(\d+)!/g, (m, n) => factorial(+n));
示例:
function factorial(num) {
if (num <= 1)
return 1;
return num * factorial(num - 1);
}
var mathString = "2!+5!+4";
var result = mathString.replace(/(\d+)!/g, (m, n) => factorial(+n));
console.log(result);
注意:不在乎析因位前面是否有-
或+
,因为它将保留在那里,因此正则表达式检索到的数字将始终是>= 0
,因此factorial
函数可以简化(请参见代码段)。
答案 1 :(得分:1)
您需要将+
放在捕获组中,而不要放在捕获组之后。
var facregex = /(\d+)!/g;
它们都匹配所有数字,但是您的版本仅捕获第一个数字,而不是所有数字。
您不需要for
循环,因为您可以将函数赋予replace()
函数。它接收匹配项和所有捕获组作为参数,并返回替换项。
var origValue = "2!+10!+4";
var facregex = /(\d+)!/g;
var calcValue = origValue.replace(facregex, function(match, group1) {
return factorial(Number(group1));
});
console.log(calcValue);
function factorial(num) {
if (num < 0)
return -1;
else if (num == 0)
return 1;
else {
return (num * factorial(num - 1));
}
}
答案 2 :(得分:1)
1。。在将!(Sign)
解析为facmatch[i]
之前,先替换Number
。
2。。使用eval
从字符串结果中获得最终计算。
function factorial(num) {
if (num < 0)
return -1;
else if (num == 0)
return 1;
else {
return (num * factorial(num - 1));
}
}
var calcvalue = "2!+5!+4";
var facregex = /(\d)+\!/gi;
var facmatch = calcvalue.match(/(\d)+\!/gi);
var faclength = calcvalue.match(/(\d)+\!/gi).length;
//console.log(faclength,facmatch);
for (var i = 0; i < faclength; i++) {
var fact=factorial(Number(facmatch[i].replace("!","")));
//console.log("Final: "+fact);
calcvalue= calcvalue.replace(facmatch[i], fact);
}
console.log("Final: "+eval(calcvalue));