2012-06-12 8 views
10

Chciałbym wiedzieć, jaki jest najlepszy sposób, aby sprawdzić ciąg na przykład (poczta, hasło ..Etc).JavaScript: test vs exec

/^...$/i.exec(a) 

vs

/^...$/i.test(a) 
  • Exec zwraca wartość
  • test prawda

Test:

// 1° way 
var mail = req.body.mail; 
if(check(mail)){ 

exec:

// 1° way 
var mail = req.body.mail; 
if(check(mail)){ 

// 2° way 
var mail = check(req.body.mail); 
if(mail){ 

Exec lub Test? i co Nr (1 ° lub 2 ° C, jeśli Exec)

ROZWIĄZANIE

Test lepiej w tym przypadku.

  • to na pewno będzie szybciej.

Ale najważniejsze

  • Test wykonuje wszystkie jego dzieła. Chociaż exec nie działał, ponieważ można zrobić więcej, ale nie potrzebujemy.
  • Jak powiedział Mattias Buelens korzystając Ismail() to bardziej logiczne: jest e-mail: tak lub nie. Podczas gdy exec: jest e-mail: e-mail lub null -> wtf? lol
+0

Co rozumiesz przez "najlepszy sposób"? – j08691

+0

1st. Zależy od tego, co próbujesz zrobić. Czy potrzebujesz pasujących/przechwytujących grup i takich lub po prostu sprawdzania poprawności, aby sprawdzić, czy podany ciąg pasuje do wyrażenia regularnego? Drugie pytanie jest oparte na preferencjach, będzie to taki sam wynik. Powinieneś wybrać, który jest bardziej czytelny i możliwy do utrzymania dla ciebie/twojego zespołu. –

+0

Istnieją dwa rozwiązania, są różne, więc myślę, że jeden z nich jest najlepszy ** EDIT ** @ Fabrício Matté: just validate. Tak, myślę, że pierwsza droga jest najlepsza, ponieważ jest bardziej czytelna i logiczna. (dla ciebie;)) –

Odpowiedz

15

Jeśli potrzebujesz tylko przetestować ciąg wejściowy, aby dopasować wyrażenie regularne, najbardziej odpowiednie jest ustawienie RegExp.test. Da Ci to wartość zwracaną przez boolean, co czyni ją idealną dla warunków.

RegExp.exec daje wartości zwracanej tablicy, jak ze wszystkimi grupami wychwytywania i dopasowanych indeksów. Dlatego jest to przydatne, gdy musisz pracować z przechwyconymi grupami lub indeksami po zakończeniu meczu. (Również, it behaves a bit different w porównaniu do String.match przy użyciu globalnego modyfikatora /g)

Ostatecznie, nie będzie to miało większego znaczenia pod względem szybkości i wydajności. Wyrażenie regularne będzie nadal oceniane, a wszystkie pasujące grupy i indeksy będą dostępne za pośrednictwem globalnego obiektu RegExp (chociaż zdecydowanie zaleca się użycie zwracanych wartości).

Co do testu if, że to tylko kwestia gustu.Przypisanie wyniku testu wyrażeń regularnych do zmiennej o znaczącej nazwie (takiej jak isEmail) może poprawić czytelność, ale poza tym oba są w porządku.

+3

To dobre wytłumaczenie, mimo że istnieją pewne wady. "RegExp.exec" daje tablicową wartość zwracaną z ** wszystkimi ** grupami przechwytywania i dopasowanymi indeksami. " Nie całkiem. Zwróci tablicę z pierwszym dopasowaniem w indeksie '[0]' i kolejnymi grupami przechwytywania w kolejnych indeksach. Nie zwraca wszystkich grup dopasowania/przechwytywania, tylko pierwsze dopasowanie ze wszystkimi grupami przechwytywania. Możesz jednak iterować za pomocą np. pętla 'while', która automatycznie przechowuje właściwość' lastIndex' w obiekcie regex, jak pokazano w podanym przez ciebie łączu MDN. –

Powiązane problemy