補間された変数を使用して正規表現を作成できるこのスクリプトに取り組んでいます。現時点ではこれを取得しており、美しく動作します:
function sRegExp( regex, vars ) {
vars = Array.prototype.slice.call( arguments, 1 );
regex = regex.toString();
var newRegex = regex.replace(/(^\/|\/$|\/([igm]+)$)/g, '')
.replace( /#\{(\d)\}/g, function( a, b ) { return vars[ +b ]; });
var mods = regex.match( /\/([igm]+)$/ );
return new RegExp( newRegex, mods ? mods[1] : '' );
}
そして、私はそれを次のように使用します:
function func() {
var foo = 'lol';
return sRegExp( /baz #{0}/i, foo );
}
console.log( func() ); //=> /baz lol/i
インデックスを使用してパラメーターとして変数を渡す代わりに、変数名を使用してこのスクリプトを改善したいので、使用することを考えたeval
のでvars
、コードを削除して少しリファクタリングしました。
function sRegExp( regex ) {
regex = regex.toString();
var newRegex = regex.replace(/(^\/|\/$|\/([igm]+)$)/g, '')
.replace( /#\{(\w+)\}/g, function( a, b ) { return eval( b ); });
__^__ __^__
var mods = regex.match( /\/([igm]+)$/ );
return new RegExp( newRegex, mods ? mods[1] : '' );
}
前の例の問題は次のとおりです。
console.log( func() ); //=> foo is not defined
しかし、グローバルスコープでは...
var foo = 'lol';
function func() {
return sRegExp( /baz #{foo}/i );
}
console.log( func() ); //=> /baz lol/i
のコンテキストを設定するにはどうすればよいですかeval
。私は試しeval.call(func)
ましたが、これは明らかにうまくいきませんでした。何か案は?