正则表达式范围中的动态替换

时间:2014-02-01 11:42:53

标签: javascript regex

我需要在JavaScript源文件中重写一些需求路径:

示例(foo => ../../../foo/baz):

  1. var a = require('foo/a'); => var b = require('../../../foo/baz/a');
  2. var a = require('foo/../b'); => var b = require('../../../foo/baz/../b');
  3. 注意:此替换将在完整的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);
    

    虽然上面的源代码正在运行。我不确定这是否保存,因为我只是跳过结束分隔符。

2 个答案:

答案 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);