如何改进(消除过多的令牌?)降低JavaScript中regexp的速度?
我有一个函数,可以在冒号前加粗一行如何改进(消除过多的令牌?)降低JavaScript中regexp的速度?,javascript,regex,Javascript,Regex,我有一个函数,可以在冒号前加粗一行 //Fast regex (time: 0) var colonRegex = /^[^*:\n]+:/gm; 及 //慢速正则表达式(时间:139)限制10个字 //var colonRegex=/^([^*:\n]+?){1,10}:/gm; //当我想对数十个div应用replace时,我遇到了问题(它会冻结chrome) var bolded=str.replace(colonRegex,函数(匹配){ 返回“+匹配+”; }); 您可以在JSFI
//Fast regex (time: 0)
var colonRegex = /^[^*:\n]+:/gm;
及
//慢速正则表达式(时间:139)限制10个字
//var colonRegex=/^([^*:\n]+?){1,10}:/gm;
//当我想对数十个div应用replace时,我遇到了问题(它会冻结chrome)
var bolded=str.replace(colonRegex,函数(匹配){
返回“+匹配+”;
});
您可以在JSFIDLE上测试它:
我哪里做错了?
我可以在回调中进行单词限制。
regex本身能做得更好吗?
谢谢你的把戏
^(?:(?=([^*:\n ]+[ ]?))\1){0,10}:
试试这个。看演示
js级别可以是:
var bolded = str.replace(colonRegex, function(match) {
if (match.indexOf(".") > 0){
match1 = match.slice(0,(match.indexOf(".")+1));
match2 = match.slice(match.indexOf(".")+1);
match = match1+"<b>"+match2+"</b>";
return match;
}
return "<b>"+match+"</b>";
});
var bolded=str.replace(colonRegex,函数(匹配){
if(match.indexOf(“.”)大于0){
match1=match.slice(0,(match.indexOf(“.”+1));
match2=match.slice(match.indexOf(“.”+1);
匹配=匹配1+“”+匹配2+“”;
复赛;
}
返回“+匹配+”;
});
你的/^([^*:\n]+?){1,10}:/gm
regex展示:你正在嵌套+
和{1,10}
重复,其间(可能)没有任何内容。通过将分隔强制匹配的组的空白进行修正:
/^([^*:\n ]+ ){0,9}[^*:\n ]+:/gm
# ^
或
对我来说,使用LMDE和Firefox都非常快,为什么要使用回调?您不能使用
.replace(colonRegex,“$1”)代码>?(如果你在正则表达式中添加一些括号:/^([^*:\n]+:)/gm
)如果我在你的小提琴中添加缓慢的正则表达式,它会在“Time:34”中运行,并且不会冻结Chrome。问题是你会遇到灾难性的回溯。当冒号前有一行超过十个单词时,模式将首先匹配这十个单词。然后它发现结尾的冒号不匹配,因此它开始一次回溯一个字符,并在一段时间内重新计算模式,直到它得到一个单词,从而可以确定该行上的模式根本不匹配。
/^([^*:\n ]+ ){0,9}[^*:\n ]+:/gm
# ^
/^[^*:\n ]+( [^*:\n ]+){0,9}:/gm