Kode, nad którym pracuję na niestandardową walidację w .Validate jest poniżej. Chcę pozwolić użytkownikowi wprowadzić adresy e-mail oddzielone przecinkiem, ale utknąłem z moją regex na zabronienie przecinku końcowego.

aaa@foo.com, bbb@bar.com = ok

aaa@foo.com,bbb@bar.com = ok

aaa@foo.com, = nie jest w porządku (uwaga, że jest tu też splatująca miejsce)

aaa@foo.com, = nie jest w porządku

Ale moim problemem jest wszystkie powyższe w poniższym są w porządku.

$.validator.addMethod('csvEmail', function (value, element) {
    return this.optional(element) || /^((([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))+(,|, |$))*$/.test(value);
}, "Please enter a valid email address or multiple valid addresses separated by a comma.");
0
Warren 20 styczeń 2020, 06:27

1 odpowiedź

Najlepsza odpowiedź

Problem z wyrażeniem {x0}} jest to, że pasujesz do pierwszej kolumny aaa@foo.com wraz z , lub ,(space) lub (end of the line). Następnie sprawdzasz, czy powtarza 0 lub więcej razy, używając *.

Jednak tutaj nie możesz użyć znaku * lub +. Chcesz, aby dopasować 2 razy zawsze . Dlatego chcesz, aby naprawić swój regex do następujących:

^((([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))+(,|, |$)){2}$

Jeśli nie zauważyłeś, usunąłem * przed $ na końcu i zastąpił go {2}. To dlatego, że chcesz 2 mecze.


Jednak poszedłbym z wyrażeniem regex:

(.+?)@(.+)\.(.+),[^\S\r\n]*(.+?)@(.+)\.(.+)

W każdym razie oboje zwracają wyniki, które chcesz, poza następującym:

aaa@foo.com, bbb@bar.com
aaa@foo.com,bbb@bar.com
aaa@foo.com, 
aaa@foo.com,

Wyróżniają tylko następujące:

aaa@foo.com, bbb@bar.com
aaa@foo.com,bbb@bar.com

W przypadku, gdy chcesz spróbować sobie, Kliknij tutaj i zmień regex między obydwoma. Oba działają.

0
Nizar 20 styczeń 2020, 03:48