2010-12-20 12 views

Odpowiedz

7

Zarówno oceniać będzie dokładnie taki sam regex, ale pierwszy jest dosłowny, co oznacza, że ​​nie możesz użyj dowolnych zmiennych wewnątrz niego, nie możesz dynamicznie generować wyrażenia regularnego.

Drugi używa jawnie konstruktora i może być użyty do tworzenia dynamicznych wyrażeń regularnych.

var x = '3', r = (new RegExp(x + '\d')); r.test('3d') 

Powyższe jest przykładem dynamicznie konstruowania regex z konstruktora, których nie można zrobić w formie dosłownej.

W 99% przypadków wystarczy oprzeć się na pierwszej wersji (literalnej) dla wszystkich wyrażeń regularnych w JS. W zaawansowanym scenariuszu, w którym trzeba powiedzieć, dane wejściowe użytkownika, aby dynamicznie budować wyrażenie regularne, wtedy potrzebna jest druga forma.

EDIT # 1: Pierwsze mecze cyfrę, drugi po prostu pasuje do nas d. Musisz dwukrotnie uciec przed drugim, aby był równy pierwszemu, co, jak zakładam, zamierzałeś zrobić. Pamiętaj tylko, że rada, którą wpisałem powyżej, jest dokładna, jeśli drugim przykładem jest nowy RegExp ("\ d").

/\d/.test('3') // true 
(new RegExp('\d')).test('3') // false 
(new RegExp('\\d')).test('3') // true 
+1

Er, wyrażenie regularne '3 \ d' nie pasuje' "3D" '... – Amber

+0

Dzięki za wyjaśnieniu, powodem Poprosiłem było miałem tego wyrażenia/^ + | [\\/#;] | + $/gi (1 lub więcej spacji LUB zawiera \/#; LUB kończy się na jednym lub więcej spacji). Podczas używania nie-konstruktora w każdym nieparzystym czasie wynik zakończył się fałszem. Na przykład. wynik był naprzemienny. Podczas korzystania z konstruktora wszystko działało zgodnie z oczekiwaniami za każdym razem. Dziwne! – bob

+0

Istnieje jeszcze jedna różnica: literał tworzy tylko jeden obiekt przy * czasie analizy *, podczas gdy funkcja konstruktora zawsze tworzy nowy obiekt. Zostanie to jednak zmienione w ES5, a literał będzie zawsze zwracał nowy obiekt. –