2

问题背景——我想获得数字的第 n 个根,用户可以在其中输入表达式,如“x 的第 n 个根”。我编写了一个函数 nthroot(x,n),它返回正确的预期输出。我的问题是提取x 和 n 的值来自表达式。

我想提取一些匹配的模式并将其存储到一个数组中以供进一步处理,以便在下一步中我将从数组中弹出两个元素并将结果替换为压制。但是我无法在不使用的情况下将所有值放入数组中环形。

我的代码的 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));

请帮助我。

4

2 回答 2

2

顾名思义,您当前使用的.replace()方法是用于进行字符串替换,而不是返回单个匹配项。改用该.match()方法会更有意义,但如果您使用回调函数,则可以(误用) :.replace()

var result = expr.replace(/the\s?([+-]\d+)th\s?root\s?of([+-]\d+)/,function(m,m1,m2){
  return nthroot(+m2, +m1);
});

请注意,回调中的参数将是字符串,因此在将它们传递给您的nthroot()函数时,我使用一元加号运算符将它们转换为数字。

于 2013-09-21T04:20:42.750 回答
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
}
于 2013-09-21T04:23:12.107 回答