Hou*_*man 4 javascript regex node.js
我正在编写一个脚本来将我的内容的所有网址更改为新的位置.
var regex = /.*cloudfront.net/
var pDistro = "newDistro.cloudfront.net/"
for(var i=0;i<strings.length;i++){
strings[i] = strings[i].replace(regex,pDistro);
}
Run Code Online (Sandbox Code Playgroud)
我正在做的字符串replace平均每个约140个字符.他们是遵循以下格式的网址:https://[thing to replace].cloudfront.net/[something]/[something]/[something]
但是这个操作非常慢,大约需要4.5秒来处理一个平均大小的阵列.
为什么这么慢?我怎样才能让它更快?
如果这个问题更适合代码回放堆栈交换或其他一些网站,请告诉我,我会把它移到那里.
我在数据库中出现的数据似乎是140个字符.在拉取过程中,发生了一些虚拟化并在字符串上添加了400多个字符,因此难怪正则表达式需要这么长时间.
正如其他人所指出的那样,140字符串循环所需的时间要少得多.
故事的寓意:"确保你拥有的数据是你所期望的"和"如果你的正则表达式花了太长时间,使用较小的字符串和更具体的正则表达式(即没有通配符)"
也许它会像这样运行得快一点:
https:\/\/[a-zA-Z0-9]+\.cloudfront\.net
Run Code Online (Sandbox Code Playgroud)
通常,您的字符集越独特,正则表达式运行得越快.
感谢@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);
}
}
Run Code Online (Sandbox Code Playgroud)
添加其他人建议的更智能的正则表达式替换,这是一个比较。更智能的regex肯定会帮助regex,但它仍然比仅使用慢.indexOf(),.slice()并且区别在Firefox中最为明显:
在此处查看jsperf:http://jsperf.com/fast-replacer
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |