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”(更新了开始文章以获得更完整的示例)