2013-05-15 13 views
6

Używam wzorca regex, który otrzymałem z regexlib do sprawdzania poprawnych adresów URL. Na ich stronie można uzyskać wzór zgodny z Twoimi potrzebami. Wszystko działa świetnie na ich miejscu, jak tylko użyć deseniu w kopalni pojawia się komunikat o błędzie:Niestandardowy regex JavaScript w klasie znaków

Nieprawidłowy zakres w klasie znaków

wiem, że to błąd zazwyczaj oznacza, że ​​łącznik jest omyłkowo używane do reprezentowania zakresu i nie jest właściwie uciekł. Ale w tym przypadku, ponieważ działa na ich stronie jestem zdezorientowany, dlaczego to nie działa na moje.

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g'); 

UWAGA: Jeśli masz zamiar przetestować regex z ich strony (stosując powyższy link) należy zmienić Regex Engine rozwijanej aby Client-side Engine i Engine rozwijaną do Javascript.

Odpowiedz

10

Albo umieścić - na koniec lub zaczynają klasy postaci lub użytku dwa backslashe zrobić regex ucieczki w ciągu ciąg

ponieważ używasz znaków trzeba użyć dwa ukośniki odwrotne dla każdego znaku specjalnego.


UWAGA

Wyjazd this odpowiedź na SO, który wyjaśnia, kiedy należy używać pojedynczych lub podwójnych ukośników odwrotnych do ucieczki znaki specjalne

+0

przeniosłem go do końca w obu klas postaci, ale teraz mogę 'Nieprawidłowe quantifier' – bflemi3

+0

nie mogłem również dwukrotnie uciec łącznik czyli (' \\ -') zamiast przesuwać go do końca? – bflemi3

+0

@ bflemi3 tak rzeczywiście możesz uciec. Sprawdź link, który podałem w ans – Anirudha

4

nie ma powodów, by używać RegExp konstruktora tutaj. Wystarczy użyć RegExp dosłowny:

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 
      ^  ^^               ^                     ^

Wewnątrz RegExp dosłowny, po prostu napisać regex naturalnie, z wyjątkiem /, która teraz potrzebuje ucieczki, ponieważ / służy jako ogranicznik w RegExp dosłownym.

W klasie znaków, ^ ma szczególne znaczenie na początku klasy postaci, - ma szczególne znaczenie w między 2 znaki, a \ ma szczególne znaczenie, które jest ucieczka inne znaki (głównie ^, -, [, ] i \), a także określenie skrótowych klas znaków (\d, \s, \w, ...). [, ] są używane jako ograniczniki dla klasy postaci, więc mają również specjalne znaczenie. (W rzeczywistości w JavaScript tylko ] ma specjalne znaczenie, i można określić [ bez ucieczki wewnątrz klasy znaków). Poza tymi 5 znakami wymienionymi powyżej, inne znaki (o ile nie są związane z sekwencją specjalną z \) nie mają specjalnego znaczenia.

Możesz zmniejszyć liczbę uciekających \ z powyższymi informacjami. Dla ^, chyba że jest to jedyna postać w klasie postaci, możesz odłożyć ją od początku klasy postaci. Dla - możesz umieścić go na końcu klasy znaków.

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 

Co zostało zmienione:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]] 
[\w`~!$=;+.^()|{}\[\]-] 
Powiązane problemy