У меня есть 2 валидатора регулярных выражений ASP.NET:
^\s*[-+.'\w]+@\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$
проверьте, действителен ли адрес электронной почты@(adres.pl|vp.pl)
проверьте, содержит ли значение какую-либо из этих строкПроблема сейчас в следующем: Строки в пункте 2 выше НЕ ДОЛЖНЫ быть разрешены, поэтому адрес электронной почты «john@adres.pl» не должен быть разрешен.
Однако валидаторы являются только положительными, что означает, что они проверяют, содержат ли они структуру. Поэтому, когда кто-то в настоящее время вводит «test@test.com», я получаю «недопустимое значение»
Мой код ниже:
<asp:TextBox ID="tbEmail" runat="server" />
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="emailinvalid" ValidationExpression="^\s*[-+.'\w]+@\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$" ID="rev1" runat="server"/>
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="not allowed" ValidationExpression="@(adres.pl|vp.pl)" ID="rev2" runat="server"/>
Сначала я думал объединить выражения 1 и 2, но тогда я не знал, какое из них не работает, и не знал, какую ошибку отображать.
Чего я ожидаю, так это:
Или, возможно, валидатор rev2
должен выполняться только в том случае, если rev1
не выдает ошибку, поэтому «складывается» из-за отсутствия лучшего термина, что a: кажется громоздким, а b: я не знаю, как это сделать.
Как я могу решить эту проблему?
ОБНОВЛЕНИЕ 1
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="invalid" ValidationExpression="^\s*[-+.'\w]+@(?!(?:adres|vp)\.pl\b)\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$" ID="RegularExpressionValidator5" runat="server"/>
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="not allowed" ValidationExpression="@(?!(?:adres|vp)\.pl\b)" ID="RegularExpressionValidator4" runat="server"/>
«gddg» приводит к «не разрешено», тогда как я ожидаю «недействительно».
Когда я переключаю порядок этих валидаторов, отображаются ошибки «недействительно» и «не разрешено».
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="invalid" ValidationExpression="^\s*[-+.'\w]+@(?!(?:adres|vp)\.pl\b)\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$" ID="RegularExpressionValidator5" runat="server"/>
<asp:RegularExpressionValidator ControlToValidate="tbEmail" ErrorMessage="not allowed" ValidationExpression="@(?!(?:adres|vp)\.pl\b)" ID="RegularExpressionValidator4" runat="server"/>
Вы можете использовать один шаблон, и вы можете написать свой существующий шаблон как:
^\s*[-+.'\w]+@(?!(?:adres|vp)\.pl\b)\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$
Часть, за исключением adres.pl
или vp.pl
, может быть записана как @(?!(?:adres|vp)\.pl\b)
, за исключением тех совпадений, которые идут непосредственно после @.
Вы также можете использовать @(?!(?:adres|vp)\.pl\s*$)
, если это последняя часть адреса электронной почты, как вы сейчас делаете для этой части \.(?!co\s*$)
См. демонстрация регулярных выражений.
Примечание, что ваш шаблон позволяет использовать начальные и конечные пробельные символы для адреса электронной почты.
@Adam Шаблон может либо совпадать, либо не совпадать, в этом случае вам придется использовать 2 шаблона или 1 проверку, чтобы увидеть, содержит ли строка адрес adres.pl или vp.pl.
Спасибо еще раз. Это та вторая часть, где я борюсь. Я хочу, чтобы второй валидатор выдал FAIL, если значение содержит @adres.pl
. В настоящее время валидатор возвращает true, если значение содержит «@adres.pl». Я думаю, что мне нужно инвертировать результат этого выражения, например. НЕ("выражение содержит @adres.pl"). Как бы я это сделал? !
оператор, по-видимому, не является обратным в регулярном выражении.
@ Адам Ты пробовал только @(?!(?:adres|vp)\.pl\b)
для второго валидатора. Он вернет true, если адресов.pl или vp.pl нет.
Я сделал, пожалуйста, смотрите мое обновление 1.
@ Адам Что, если вы используете весь шаблон ^\s*[-+.'\w]+@(?!(?:adres|vp)\.pl\b)\w+(?:[-.]\w+)*\.(?!co\s*$)\w{2,}\s*$
для второго валидатора? Возможно, вы можете использовать обработчик кликов для второго валидатора и взять строковое значение из источника, который вы хотите проверить, и сделать так, чтобы строка не содержала проверки и вручную установила, действительна ли проверка или нет?
В конце концов, мы получили собственный валидатор, спасибо!
Спасибо, это выражение работает. Я попытался добавить это в один валидатор, но это привело бы к неясному сообщению пользователю: либо адрес электронной почты синтаксически неверный, либо адрес электронной почты не разрешен (из-за правила исключения моего провайдера электронной почты). Мне нужно знать, какое из этих двух выражений не смогло обеспечить четкое общение с конечным пользователем.