使用动态RegExp获取$ 1捕获组

时间:2015-06-10 20:59:26

标签: javascript regex capture-group

如果有人知道我在这里做错了什么,我很好奇。我想在表达式中使用变量,但出于某些原因,当我尝试时,它似乎没有使用$1获取搜索词。

这会正确返回:

$('.content').html(function(_,i) {
  return  i.replace(/(cat)/gi, '<span class="highlight">$1</span>');
});

出于某种原因,这不是:

$('.content').html(function(_,i) {
  var customVariable = 'cat';
  var pattern = new RegExp(customVariable,'gi');
  return  i.replace(pattern, '<span class="highlight">$1</span>');
});

我很高兴在RegExp中捕获群组,我无法找到其他人遇到此问题所以我认为我错过了一些非常简单的事情。

2 个答案:

答案 0 :(得分:6)

你忘了括号:

var pattern = new RegExp('(' + customVariable + ')','gi');

$1是对第1组的反向引用,但您没有。

实际上,您可以在MDN网站上的JavaScript replace中找到more about backreferences。确实,如果您不想在备选方案之前或之后匹配任何文本,则只需要设置捕获组,因为在使用正则表达式时,可以使用{{1}引用整个匹配的文本。 } pattern(在您的情况下,您只需要将$&替换为$1)。

  

$&插入匹配的子字符串。

答案 1 :(得分:2)

您不需要定义子模式,因为您要突出显示整个匹配项。你可以这样做:

var pattern = new RegExp(customVariable, 'gi');
i.replace(pattern, '<span class="highlight">$&</span>');

$&指的是整个模式。