我有以下字符串 var foo = require('foo/bar');
,我想更改为 var foo = require('../../foo/bar');
。
到目前为止,我编写了以下代码:
var search = 'foo/bar';
var replace = '../../foo/bar';
var regex = new RegExp('require[(]("|')' + search + '("|')[)]', 'g');
var source = 'var foo = require('foo/bar')';
source.replace(regex, 'require('' + replace + '')');
但是,如您所见,这非常低效。我该怎么做才能使这条正则更短一些。例如:
- 只需要替换路径,而不必用
require('' + replace + '')'
重写要求 - 使
("|')
和[(]
短 - 其他吗?
最好,bo
编辑:我在完整的JavaScript源文件上进行此替换。
edit2:当foo/
和../../foo/baz/
应变量时,将var foobar = require('foo/bar');
更改为var foobar = require('../../foo/baz/bar')
有必要什么?
您可以使用此代码:
var search = 'foo/bar';
var source = "var foo = require('foo/bar')";
var regex = new RegExp('(require)\((["'])(' + search + ')\2\)', 'g');
var repl = source.replace(regex, "$1('../../$3')");
//=> var foo = require('../../foo/bar')
这是一个替代方案:
var str = "var foo = require('foo/bar');";
str = str.split(/(')/);
str.splice(2, 0, '../../');
str = str.join('');
更简单:
"var foo = require('foo/bar');".replace(/'([^']+)'/, "'../../$1'")
我想知道您是否可以在var xxx = require()
语句中包裹路径之前进行替换。
优化的代码首先要撤消之前完成的工作似乎有点效率低。
此外,您似乎已经知道目标路径(示例中的foo/bar
),但是甚至不需要使用它。
在开口报价之后,这里的REGEXP归结为拆分字符串,并插入../../
前缀。
您可以用
做到这一点source = source.split(/["']/,2).join('"../../')+'");';
REGEXP是一个常数,因此您可以将其放入一个变量中,以使其一劳永逸。
这可能比每次从您的示例中生成和重新编译REGEXP更有效。
但是,无论如何,我想知道您必须替换多少个这样的字符串才能开始注意到性能。