我怎样才能加快我的正则expression式?

我正在编写一个脚本,将我的内容的所有url更改为新的地方。

var regex = /.*cloudfront.net/ var pDistro = "newDistro.cloudfront.net/" for(var i=0;i<strings.length;i++){ strings[i] = strings[i].replace(regex,pDistro); } 

我所做的string平均每个replace大约140个字符。 他们的url是https://[thing to replace].cloudfront.net/[something]/[something]/[something]

但是这个操作非常慢,大约需要4.5秒来处理一个平均大小的数组。

为什么这么慢? 我怎样才能使这个更快?

如果这个问题会更适合codereview堆栈交换或其他网站,让我知道,我会把它移到那里。

编辑:

数据,因为它在数据库中出现,我似乎是140个字符。 在拉动过程中,发生了一些虚拟化,并在string上添加了400多个字符,难怪正则expression式需要这么长时间。

正如其他人所指出的那样,140个字符的string循环花费的时间要less得多。

故事的寓意:“确保你所拥有的数据是你期望的数据”和“如果你的正则expression式需要的时间太长,使用更小的string和更具体的正则expression式(即没有通配符)”

也许它会像这样跑得快一点:

 https:\/\/[a-zA-Z0-9]+\.cloudfront\.net 

通常,你的字符集越独特,正则expression式运行得越快。


感谢@sbedulin提供了一个jsperf链接

对于这样一个简单的replace,一个正则expression式可能不是最快的search和replace。 例如,如果使用.indexOf()replacesearch,然后使用.slice()进行replace,则可以将其加速12-50倍(取决于浏览器)。

我不确定你想要模拟的确切的replace逻辑,但是这是一个非正则expression式,速度要快很多:

 var pos, str, target = "cloudfront.net/"; var pDistro = "https://newDistro.cloudfront.net/" for(var i = 0; i < urls.length; i++){ str = urls[i]; pos = str.indexOf(target); if (pos !== -1) { results[i] = pDistro + str.slice(pos + target.length); } } 

join其他人build议的更智能的正则expression式replace,这里是一个比较。 更智能的正则expression式肯定有助于正则expression式,但它仍然比只使用.indexOf().slice()慢,差异是Firefox中最明显的:

在这里看到jsperf: http ://jsperf.com/fast-replacer

在这里输入图像描述