繁体   English   中英

我怎样才能加速我的正则表达式?

[英]How can I speed up my regex?

我正在编写一个脚本来将我的内容的所有网址更改为新的位置。

var regex = /.*cloudfront.net/
var pDistro = "newDistro.cloudfront.net/"

for(var i=0;i<strings.length;i++){
    strings[i] = strings[i].replace(regex,pDistro);
}

我正在做的字符串平均每个replace大约140个字符。 他们的网址遵循以下格式: https://[thing to replace].cloudfront.net/[something]/[something]/[something]

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

为什么这么慢? 我怎样才能让它更快?

如果这个问题更适合代码回放堆栈交换或其他一些网站,请告诉我,我会把它移到那里。

编辑:

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

正如其他人所指出的那样,140字符串循环所需的时间要少得多。

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

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

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

通常,您的字符集越独特,正则表达式运行得越快。


感谢@sbedulin提供jsperf链接

对于这种简单的替换,正则表达式可能不是最快的搜索和替换。 例如,如果用.indexOf()替换搜索,然后使用.slice()进行替换,则可以将其加速12-50倍(取决于浏览器)。

我不确定你想要模拟的确切替换逻辑,但是这里的非正则表达方法要快得多:

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);
    }
}

添加其他人建议的更智能的正则表达式替换,这是一个比较。 更智能的正则表达式肯定有助于正则表达式,但它仍然比仅使用.indexOf().slice()更慢,而且差异是Firefox中最明显的:

请参阅jsperf: http ://jsperf.com/fast-replacer

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM