2016-10-04 15 views
1

私は変数として動的に作成された関数に後方参照を渡そうとしています(バックリファレンスが設定されていて、エラーをスローしていないかどうかを確認できます)。どのようにそれを動作させることができますか? RegExの後方参照を変数として渡すには?

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

ありがとう:

これは、コードです!

+1

を、あなたは*キャプチャグループ*ではなく、後方参照を意味していますか?たとえば、 '(。*)'グループの内容である 'br 'を探していますか? –

+0

@ T.J。 Crowder "たとえば、(*。)グループのコンテンツにbrをお探しですか? - はい、そうです。 –

答えて

2

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

+0

パーフェクト!ありがとうございました!!! –

関連する問題