2011-11-01 17 views
17

Niedawno mieliśmy błąd, gdy inny programista zmienił literaturę RegExp na wywołanie konstruktora, a ja zastanawiałem się, dlaczego jest jakakolwiek różnica. Dokładna kodowymRóżnice między literałem regexp JavaScript a konstruktorem

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag); 

vs oryginału

var parts = /rt:([^@]+)@(\d+)/.exec(tag); 

Gdy tag jest przykładowo rt:[email protected], pierwszy (błędy) wywołanie wraca null, natomiast drugi powraca ["rt:[email protected]", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

Nie trzeba dodawać, że cofnąłem zmianę, ale chciałbym się dowiedzieć, dlaczego istnieje taka różnica.

Odpowiedz

33

Istnieją dwa problemy:

/nie część wyrazu. Są to ograniczniki, oznaczające literał regex. Muszą być usunięte, jeśli używasz RegExp, w przeciwnym razie dosłownie odpowiadają slashowi.

Po drugie, ukośnik odwrotny jest znakiem escape w literałach ciągów znaków. Aby utworzyć dosłowne wyrażenie \, musisz uciec z niego w ciągu znaków.

Zatem odpowiednikiem byłoby:

new RegExp("rt:([^@]+)@(\\d+)") 

Zwłaszcza Cytowanie sprawia wyrażenie nieco trudniej pisać, jeśli chcesz używać RegExp. Jest to potrzebne tylko wtedy, gdy chcesz dynamicznie utworzyć wyrażenie, to znaczy, jeśli chcesz na przykład uwzględnić tekst przechowywany w zmiennej. Jeśli masz stałe wyrażenie, literalne /.../ jest łatwiejsze do napisania i bardziej zwięzłe.

+0

Dobra odpowiedź, pomyśl, że usunę mój! Co zrobić, jeśli chcesz ponownie użyć określonego RegExp - czy to nie jest dobry czas na użycie konstruktora? A może po prostu wypowiesz 'var resuasableRegex =/.. pattern ../;'? –

+0

@ ElRonnoco: Dokładnie, możesz także przypisać literał regex do zmiennej. –

+0

Dzięki za informacje. Następnym razem lepiej przyjrzę się strunom, aby upewnić się, że nie ma potrzebnych znaków ucieczki. W każdym razie dosłowne jest znacznie łatwiejsze na pewno. –

4

\d należy uciec po przekazaniu do konstruktora new RegExp. Tak, to musi być

var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag); 
Powiązane problemy