2011-08-10 14 views
14

mam pewne problemy z tym małym kodu javascript:JavaScript i wyrażenia regularne: składnia literalna vs. RegExp przedmiot

var text="Z Test Yeah ! Z"; 

// With literal syntax, it returns true: good! 
alert(/(Z[\s\S]*?Z)/g.test(text)); 

// But not with the RegExp object O_o 
var reg=new RegExp('Z[\s\S]*?Z','g'); 
alert(reg.test(text)); 

ja nie rozumiem, dlaczego dosłowne składnia i obiekt RegExp nie daje mi ten sam wynik ... Problem polega na tym, że Muszę użyć obiektu RegExp, ponieważ będę miał później kilka zmiennych.

Wszelkie pomysły?

góry dzięki :)

+2

Dobra robota przy pisaniu dobrze sformatowanego, dobrze napisanego pierwszego pytania. – zzzzBov

Odpowiedz

18

trzeba podwoić uciec \ znaki napisowych, dlatego regex dosłowny jest zwykle korzystne.

Spróbuj:

'Z[\\s\\S]*?Z' 
+0

To prawda, z tylnymi ukośnikami działa ...! Dziękuję bardzo, ponieważ nie potrzebujemy ich dosłownej składni, nie sądziłem, że są one obowiązkowe dla obiektu RegExp. Jeszcze raz dziękuję! – KorHosik

+0

@zzzzBov Dlaczego musimy uciec przed '\\' w drugim przypadku, a nie w pierwszym przypadku? – Geek

+3

@Geek, pierwsze używane wyrażenie regularne jest literałem RegExp. Drugim używanym wyrażeniem regularnym jest konstruktor obiektu RegExp z literałem tekstowym jako argumentem. Moja odpowiedź wyraźnie mówi, że musisz podwoić znaki '' \ '' w literałach ciągów. W przypadku literałów ciągowych '' \ '' służy do tworzenia sekwencji escape dla wartości, podczas gdy w wyrażeniu regularnym chcemy, aby sekwencja escape była * be * wartością. '' "\ n" '' tworzy ciąg znaków o wartości nowej linii, natomiast '' "\\ n" '' tworzy ciąg o wartości '' \ n''. Rozróżnienie jest bardzo ważne dla regularnych wzorców ekspresji. – zzzzBov

2

Myślę, że to dlatego, że trzeba uciekać swoje backslashy, nawet podczas korzystania apostrofów. Wypróbuj to:

new RegExp('Z[\\s\\S]*?Z','g') 
Powiązane problemy