2014-12-05 12 views
8

Ho una funzione in grassetto prima del colon.Come migliorare (eliminare troppi token?) Regexp lento in JavaScript?

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

e

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

è possibile testare su jsfiddle: http://jsfiddle.net/damg7zuk/4/

dove faccio un errore? Posso limitare le parole all'interno del callback. Si può fare meglio nella regex stessa? Grazie per il tuo trucco.

+0

per me entrambi sono super veloce utilizzando LMDE e Firefox –

+0

perché stai usando una richiamata? Non puoi usare '.replace (colonRegex," $ 1 ");'? (Se aggiungi alcune parentesi alla regex: '/^([^ *: \ n] +:)/gm'.) Se aggiungo la regex lenta al tuo violino funziona in" Time: 34 "e non bloccare Chrome. – nnnnnn

+2

Il problema è che si ottiene un backtrack catastrofico. Quando hai una riga con più di dieci parole prima dei due punti, il modello corrisponderà per prima alle dieci parole. Poi scopre che i due punti alla fine non coincidono, quindi inizia a retrocedere di un personaggio alla volta e rivalutare il modello su un over finché non arriva a una singola parola dove può determinare che il pattern non corrisponde affatto su quella linea. – Guffa

risposta

1

js livello può essere così:

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

vostri /^([^*:\n ]+ ?){1,10}:/gm mostre regex catastrophic backtracking: Stai nidificazione del + e la {1,10} ripetizione con (possibilmente) niente in mezzo. Risolvere il facendo il vuoto che separa i gruppi obbligatorie per abbinare:

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

o

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