优化正则表达式以替换路径



我有以下字符串 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更有效。

但是,无论如何,我想知道您必须替换多少个这样的字符串才能开始注意到性能。

最新更新