Regex - CSV адреса электронной почты в порядке, но как предотвратить завершение запятой? - PullRequest
0 голосов
/ 04 февраля 2019

Я использую плагин jQuery .validate.Я написал специальное правило, разрешающее разделять запятыми адреса электронной почты, которые выглядят следующим образом:

$.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.");

Это работает для: test@test.com, example@test.com, а также то же самое без пробела в середине.

Но это то, где я застрял, потому что это также работает для: test@test.com, и есть моя проблема.

Какую часть регулярного выражения нужно изменить, чтобы запретить действительный адрес электронной почты, заканчивающийся запятой?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

давайте по частям ... сначала как получить действительный элемент домена.Он состоит из буквенно-цифровых строк, которые могут содержать дефис между двумя символами, но не на концах и не повторяться.Это можно сделать с помощью этого регулярного выражения:

[a-zA-Z0-9](-?[a-zA-Z0-9])*

Вы видите, поскольку дефис необязателен, буквенно-цифровые строки без дефиса допускаются любой длины, они не могут быть на любом конце и дефис не может быть повторен (дефис всегда окружен буквенно-цифровым символом. Это сформирует компонент домена, чтобы один или несколько компонентов домена были разделены точками ... мы используем тот же подход и пишем:

<EXP>(\.<EXP>)*

, где <EXP> -приведенное выше регулярное выражение.

[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*

это будет соответствовать доменной части адреса электронной почты. Чтобы сформировать остальное, мы разрешаем любой символ (кроме @, и ,), поскольку они используютсядля разделения компонентов:

[^@,\s]+

, поэтому наше регулярное выражение приводит к:

[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*

, а затем мы разрешаем любое их повторение, разделенное \s*,\s* (запятая, окруженная любым числомпробелы):

<EXP>(\s*,\s*<EXP>)*

где <EXP> - это выражение выше:

[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*(\s*,\s*[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*)*

будет выражением, которое будет анализировать все, как вы захотите. См. demo для демонстрации того, как это работает.

Это кажется сложным, но вы должны написать это только один раз.

Ожидайте, что это поможет.

0 голосов
/ 04 февраля 2019

Последняя часть выражения:

)+(,|, |$))*$

Обратите внимание, что ,|, эквивалентно , ? (или, возможно, ,\s*, чтобы быть более гибким).

Oneспособ предотвратить запятую через запятую:

)+(,\s?(?!$)|$))*$

Это говорит: "запятая совпадения, за которой следует необязательный пробел, но только если за ним не следует конец ввода".

Чем нормальнееспособ сделать что-то будет с другой конструкцией A(BA)* вместо (A(B|$))*, но ясно, что повторение здесь будет подвержено ошибкам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...