我需要在JavaScript源文件中重写一些需求路径:
示例(foo
=> ../../../foo/baz
):
var a = require('foo/a');
=> var b = require('../../../foo/baz/a');
var a = require('foo/../b');
=> var b = require('../../../foo/baz/../b');
注意:此替换将在完整的js源文件上完成。因此require('
和')
必须用作分隔符!
到目前为止,我们已经想出使用这样的设置:
var source = '';
source += "var a = require('foo/a');\n";
source += "var b = require('foo/../b');\n";
source += "console.log(a + b);";
var options = {
'foo': '../../../foo/baz'
};
for (var key in options) {
var regex = new RegExp('require[(](\"|\')' + key, 'g');
source = source.replace(regex, "require('" + options[key]);
}
console.log(source);
虽然上面的源代码正在运行。我不确定这是否保存,因为我只是跳过结束分隔符。
答案 0 :(得分:2)
我认为这样做:
str = str.replace(/require\((['"])([^'"]*)foo\/([^'"]*)(['"])/g, "require($1$2../../../foo/baz/$3$4");
这是正则表达式:http://regex101.com/r/bE5jI4
说明:
require
字面匹配字符require
(区分大小写)
\(
字面匹配字符(
第一个捕获小组(['"])
['"]
字面匹配'
或"
第二个捕获小组([^'"]*)
[^'"]*
匹配下面列表中不存在的单个字符
'"
列表'"
中的单个字符
foo
字面匹配字符foo
(区分大小写)
\/
字面匹配字符/
第3个捕获组([^'"]*)
[^'"]*
匹配下面列表中不存在的单个字符
量词:在零和无限次之间,尽可能多次,根据需要回馈[贪心]
'"
列表'"
中的单个字符
第4个捕获组(['"])
['"]
匹配'
或"
字面意思如果在开场引号之前有可选的空格,或者您的路径可能包含'
或"
字符,则可能需要进行调整。 (在后一种情况下,您需要两次替换,一次是在包装引号为'
时,另一次是在"
时。)
答案 1 :(得分:2)
这应该有效:
var source = '';
source += "var a = require('foo/a');\n";
source += "var b = require('foo/../b');\n";
source += "console.log(a + b);";
var options = {
'foo': '../../../foo/baz'
};
for (var key in options) {
var regex = new RegExp('(require)\\((["\'])(' + key + ')([^"\']*)\\2\\)', 'g');
source = source.replace(regex, "$1('" + options[key] + "$4')");
}
console.log(source);
var a = require('../../../foo/baz/a');
var b = require('../../../foo/baz/../b');
console.log(a + b);