问题背景 - 我想得到数字的第n个根,用户可以输入表达式,如“x的第n个根”。我写了一个函数nthroot(x,n),返回正确的预期输出。我的问题是从表达式中提取x和n的值。
我想提取一些匹配的模式并将其存储到一个数组中进行进一步处理,以便在下一步中我将从数组中弹出两个元素并将结果替换为repression.But我无法将所有值都输入到不使用循环的数组。
我的代码的perl等价如下所示。
$str = "the 2th root of 4+678+the 4th root of -10000x90";
@arr = $str =~ /the ([-+]?\d+)th\s?root\s?of\s?([-+]?\d+)/g;
print "@arr";
我想要javascript等同于上面的代码。
或
任何一行表达式如下所示。
expr = expr.replace(/the\s?([+-]\d+)th\s?root\s?of([+-]\d+)/g,nthroot(\\$2,\\$1));
请帮助我。
答案 0 :(得分:2)
您正在使用的.replace()
method,顾名思义,用于替换字符串,而不是返回单个匹配项。使用.match()
method会更有意义,但如果使用回调函数,可以(误)使用.replace()
:
var result = expr.replace(/the\s?([+-]\d+)th\s?root\s?of([+-]\d+)/,function(m,m1,m2){
return nthroot(+m2, +m1);
});
请注意,回调中的参数将是字符串,因此在将它们传递给nthroot()
函数时,我将使用unary plus运算符将它们转换为数字。
答案 1 :(得分:0)
var regex=/the ([-+]?\d+)th\s?root\s?of\s?([-+]?\d+)/g;
expr=expr.replace(regex, replaceCallback);
var replaceCallback = function(match,p1,p2,offset, s) {
return nthroot(p2,p1);
//p1 and p2 are similar to $1 $2
}