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

How to pass a RegEx backreferences as a variable?

本文关键字:变量 引用 RegEx      更新时间:2023-09-26

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

代码如下:

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 "));

谢谢!

传递给replace的函数将接收完整匹配作为其第一个参数,然后是包含捕获组内容的附加参数。所以你可以在你的函数中声明这些,然后直接在你的regexMap#replace方法中使用这个函数。参见***注释:

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 "));