在正则表达式替换中不能使用$ 2反向引用

时间:2016-08-06 16:34:31

标签: javascript regex

我正在尝试使用string.replace正则表达式创建一个javascript计算器,但我遇到了问题。
例如,我的输入是10k,我正在尝试用000替换k。

所以,我已经制作了这个正则表达式,试图用字符串k中的字母kmbt的索引替换所有出现的。

var answer = "10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, "kmbt".indexOf("$2"));

当我在console.log中时,它返回-1,这不是我想要的。

所以将正则表达式稍微更改为:var answer = "10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, "$2");它将正确返回k

我希望它返回的是0,它是字符串“kmbt”中字母k的位置。有了这个位置,我想继续计算,但目前与此问题无关。

问题是显然我不能在正则表达式的'替换'部分使用函数。

有没有人知道这个问题的解决方案或我如何在'替换'部分使用函数?

ANSWER
您不能直接在正则表达式中进行修改,因此您必须在“替换”部分添加一个函数作为参数,您可以在其中对结果进行修改!
var answer = rsn.replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, function(match, p1, p2) { // do something with p1 and p2 and return something return p1 + p2 // for example });

2 个答案:

答案 0 :(得分:3)

您可以使用函数来替换字符串,如下所示:

$a=0; //initalize $a
$num = array(4, 25, 60, 7, 8); 
foreach($num as $numbers){ 
    if(($numbers % 5) == 0){ 
        $a++; //increment a
    } 
}

"10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, function(match, p1, p2) { return p2; }); p1对应正常替换中的p2"$1"。在返回结果之前,可以在函数中进行任何其他转换或计算。为了在字符串"$2"中找到p2的索引,这应该有效:

"kmbt"

您可以详细了解如何执行此操作here

答案 1 :(得分:1)

首先indexOf与正则表达式模式无关,因此$2将不可用。第二次替换可以取一个函数。

var SUFFIXES = {
  k: '000',
  m: '000000',
  b: '000000000',
  t: '000000000000'
};

'10k'.replace(/([\d.,]+)([kmbt])/, function (match, digits, suffix) {
  return digits + SUFFIXES[suffix];
});