我有以下字符串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 + '\')'
(\"|\')
和[(]
缩短最佳, 博
修改 我正在对完整的javascript源文件进行替换。
EDIT2:
当var foobar = require('foo/bar');
和var foobar = require('../../foo/baz/bar')
变化时,有必要将foo/
更改为../../foo/baz/
吗?
答案 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('"../../')+'");';
正则表达式是一个常量,所以你可以把它放到一个变量中,让它一劳永逸地编译。
这可能比每次从示例中生成和重新编译正则表达式更有效。
但无论如何,我想知道你需要更换多少这样的字符串来开始注意性能损失。