如何将RegEx反向引用作为变量传递?

时间:2016-10-04 09:57:27

标签: javascript regex scope

我试图将反向引用传递给动态创建的函数作为变量(所以我可以检查是否设置了反向引用,如果没有引发错误)但我找不到解决方案传递它。你怎么能让它发挥作用???

这是代码:



class regexMap {
  constructor(map) {
    this.map = map;
  }

  replace(str){
    for (var i = 0; i < this.map.length; i++){
      var regexp = new RegExp(this.map[i][0], 'ig');
      str = str.replace(regexp, this.map[i][1].apply(this));
    }
    return str;
  }
}
// EXAMPLE:
var map = [
  [/FIND (.*)/g,function(){
    var br = '$1'; // Don't work.
    if(br != '' && br != undefined){
      return 'find(\'$1\');'
    } else {
      console.error('Find requires a string');
      return;
    }
  }],
];

console.log(new regexMap(map).replace("FIND This is a string\nFIND "));
&#13;
&#13;
&#13;

谢谢!

1 个答案:

答案 0 :(得分:2)

您传入replace的功能将接收完整匹配作为其第一个参数,然后是包含捕获组内容的其他参数。因此,您可以在函数中声明这些,然后直接在regexMap#replace方法中使用该函数。请参阅***评论:

&#13;
&#13;
class regexMap {
  constructor(map) {
    this.map = map;
  }

  replace(str){
    for (var i = 0; i < this.map.length; i++){
      var regexp = new RegExp(this.map[i][0], 'ig');
      str = str.replace(regexp, this.map[i][1].bind(this)); // ***
    }
    return str;
  }
}
// EXAMPLE:
var map = [
  [/FIND (.*)/g,function(m, br){                            // ***
    if(br != '' && br != undefined){
      return 'find(\'' + br + '\');'
    } else {
      console.error('Find requires a string');
      return;
    }
  }],
];

console.log(new regexMap(map).replace("FIND This is a string\nFIND "));
&#13;
&#13;
&#13;