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

时间:2014-02-01 09:46:20

标签: javascript regex replace

我有以下字符串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 + '\')'
  • 重写require
  • 使(\"|\')[(]缩短
  • 其他什么?

最佳, 博

修改 我正在对完整的javascript源文件进行替换。

EDIT2:var foobar = require('foo/bar');var foobar = require('../../foo/baz/bar')变化时,有必要将foo/更改为../../foo/baz/吗?

3 个答案:

答案 0 :(得分:2)

您可以使用此代码:

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')

答案 1 :(得分:0)

这是另一种选择:

var str = "var foo = require('foo/bar');";
str = str.split(/(')/);
str.splice(2, 0, '../../');
str = str.join('');

更简单:

"var foo = require('foo/bar');".replace(/'([^']+)'/, "'../../$1'")

答案 2 :(得分:0)

我想知道你是否可以在将你的路径包含在var xxx = require()语句中之前进行替换。

优化通过撤消之前所做的事情而开始的代码似乎效率低下。

此外,您似乎已经知道目标路径(示例中为foo/bar),但甚至不需要使用它。

这里的正则表达式归结为在开头引号之后拆分字符串并插入../../前缀。

你可以用

做到这一点
source = source.split(/["']/,2).join('"../../')+'");';

正则表达式是一个常量,所以你可以把它放到一个变量中,让它一劳永逸地编译。
这可能比每次从示例中生成和重新编译正则表达式更有效。

但无论如何,我想知道你需要更换多少这样的字符串来开始注意性能损失。