如何改进(消除太多令牌?)JavaScript中的regexp缓慢?

时间:2014-12-05 12:26:38

标签: javascript regex

我有功能在冒号之前加粗部分行。

//Fast regex (time: 0)
var colonRegex = /^[^*:\n]+:/gm;

//Slow regex (time: 139) Limit by 10 words 
//var colonRegex = /^([^*:\n ]+ ?){1,10}:/gm;
// I have issue with it when I want to apply replace to tens of divs (it freezes chrome)

var bolded = str.replace(colonRegex, function(match) {
    return "<b>"+match+"</b>";
});

你可以在jsfiddle:http://jsfiddle.net/damg7zuk/4/

上测试它

我在哪里犯了错误? 我可以在回调中限制字数。 在正则表达式本身可以做得更好吗? 谢谢你的伎俩。

3 个答案:

答案 0 :(得分:2)

您的/^([^*:\n ]+ ?){1,10}:/gm正则表达式展示catastrophic backtracking:您将+{1,10}重复嵌套在(可能)之间。通过使分隔组的空白必须匹配来解决此问题:

/^([^*:\n ]+ ){0,9}[^*:\n ]+:/gm
#           ^

/^[^*:\n ]+( [^*:\n ]+){0,9}:/gm

答案 1 :(得分:1)

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

答案 2 :(得分:0)

^(?:(?=([^*:\n ]+[ ]?))\1){0,10}:

试试这个。看看演示。

https://regex101.com/r/kX9kT1/1