2016-02-17 8 views
6

Sto provando a eseguire questa espressione regolare ma ha bloccato la mia console. Perché?Perché questo codice è bloccato node.js - Bug su Javascript?

var str = "Шедевры православной музыки - 20 золотых православных песен"; 
str.match(/^(([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$/i); 
+3

Cosa intendi con bloccato? Lo inserisci nella console e si blocca? – Cristy

+8

Causa solo [backtracking catastrofico] (https://regex101.com/r/eT6gL3/1) a causa di '(([\ u00C0- \ u1FFF \ u2C00- \ uD7FF] + [^ az \ u00C0- \ u1FFF \ u2C00- \ uD7FF] *) +) 'parte. Maggiori dettagli su [backtracking catastrofico possono essere trovati qui] (http://www.regular-expressions.info/catastrophic.html). Quali sono i requisiti effettivi per la regex? –

+1

Stai cercando ['^ ([\ u00C0- \ u1FFF \ u2C00- \ uD7FF] + (?: [^ Az \ u00C0- \ u1FFF \ u2C00- \ uD7FF] + [\ u00C0- \ u1FFF \ u2C00- \ uD7FF] +) *) [az] + [^ \ u00C0- \ u1FFF \ u2C00- \ uD7FF] * $ '] (https://regex101.com/r/eT6gL3/2)? –

risposta

8

tuo regex provoca catastrophic backtracking (vedi a demo of your regex here) a causa di (([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+) parte. Dato che [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]* può corrispondere a zero caratteri, in pratica si ha un modello classico (a+)+ (cf: ([\u00C0-\u1FFF\u2C00-\uD7FF]+)+) che causa un problema di backtracking.

di sbarazzarsi di esso, è necessario assicurarsi che i sottopattern sono obbligatoria all'interno del raggruppamento, e applicare un quantificatore * a tutto il gruppo:

^([\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)*) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$ 

Vedi regex demo

Qui, [\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)* incontri:

  • [\u00C0-\u1FFF\u2C00-\uD7FF]+ - uno o più caratteri da [\u00C0-\u1FFF\u2C00-\uD7FF] intervalli
  • (?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)* - zero o più sequenze di:
    • [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+ - uno o più caratteri diversi da quelli delle gamme a-z\u00C0-\u1FFF\u2C00-\uD7FF
    • [\u00C0-\u1‌​FFF\u2C00-\uD7FF]+ - uno o più caratteri dal \u00C0-\u1‌​FFF\u2C00-\uD7FF intervalli.
Problemi correlati