2016-02-17 21 views
6

Próbuję uruchomić to wyrażenie, ale zablokowałem moją konsolę. Czemu?Dlaczego ten kod utknął node.js - błąd w JavaScript?

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

Co masz na myśli przez utknięcie? Wchodzisz do tego w konsoli i zamarza? – Cristy

+8

Po prostu powoduje [katastrofalne cofanie] (https://regex101.com/r/eT6gL3/1) z powodu '(([\ u00C0- \ u1FFF \ u2C00- \ uD7FF] + [^ az \ u00C0- \ u1FFF \ u2C00- \ uD7FF] *) +) 'część. Więcej informacji na temat [katastroficznego powrotu można znaleźć tutaj] (http://www.regular-expressions.info/catastrophic.html). Jakie są rzeczywiste wymagania dotyczące wyrażenia regularnego? –

+1

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

Odpowiedz

8

Twój regex powoduje catastrophic backtracking (patrz a demo of your regex here) z powodu (([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+) część. Ponieważ [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]* może dopasować zero znaków, w zasadzie masz klasyczny wzór podobny do (porównaj: ([\u00C0-\u1FFF\u2C00-\uD7FF]+)+), który powoduje problem z cofaniem.

Aby się go pozbyć, trzeba upewnić się, że podwzorów są obowiązkowego wewnątrz ugrupowania, a zastosowanie * kwantyfikator do całej grupy:

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

Zobacz regex demo

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

  • [\u00C0-\u1FFF\u2C00-\uD7FF]+ - jeden lub więcej znaków z [\u00C0-\u1FFF\u2C00-\uD7FF] zakresy
  • (?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)* - zero lub więcej sekwencji:
    • [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+ - jeden lub więcej znaków inne niż te z a-z\u00C0-\u1FFF\u2C00-\uD7FF zakresach
    • [\u00C0-\u1‌​FFF\u2C00-\uD7FF]+ - jeden lub więcej znaków z zakresów \u00C0-\u1‌​FFF\u2C00-\uD7FF.