Javascript 为路径替换优化正则表达式

Javascript 为路径替换优化正则表达式,javascript,regex,replace,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(

我有以下字符串
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重写为
    require(\''+replace+'\')'
  • 使
    (\“|\”)
    [(]
    更短
  • 还有别的吗
最好的, 博

编辑: 我正在对完整的javascript源文件进行替换

Edit2:
foo/
时,将
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更有效


但无论如何,我想知道你需要替换多少这样的字符串才能开始注意到性能的下降。

效率低下,怎么做?以毫秒/十分之一秒为单位?除非你
需要
兆字节的无用代码,否则它与任何其他主要网站的用户体验没有什么不同。就我个人而言,我关心的是用户交互体验r除了
require
部分,因为你永远无法摆脱第三方的垃圾,那就是谷歌/facebook/foo/da/blah,我想你会包括在内。谷歌!一个无明显原因延迟/挂起你的网站的奇妙例子是我们似乎容忍的。当第三方无意义的控制ls 99%的流量imo:)@gwillie可读性至少如果你可以在regex上对此提出异议:)但是仍然缺少一个用例(忘记提及)如果我还想允许在require调用中用“../../foo/baz/”替换“foo/”,我该怎么办?因为你需要使用:
source.replace(regex,$1(“../../$3/baz/”);
是否有可能在指定范围内替换整个foo(例如,
要求(“”)
?)是的,肯定可以,只是在替换部分中不要使用
$3
。然后我缺少文件名“bar”(更新了开始文章以获得更完整的示例)