在javascript中将匹配的数据放入数组中而不使用任何循环

时间:2013-09-21 03:58:46

标签: javascript regex

问题背景 - 我想得到数字的第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));

请帮助我。

2 个答案:

答案 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
}