如何改进(消除过多的令牌?)降低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