电子邮件正则表达式验证

8

有人能纠正下面的表达式,使其不允许空白字段吗?

<asp:RegularExpressionValidator ID="expEmail" runat="server" ControlToValidate="txtEmail" ErrorMessage="valid email address required" ValidationExpression="^([a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]){1,70}$"></asp:RegularExpressionValidator>

3
那个表达式无效,例如加号(+)会触发一个错误。 - mbillard
1
编写正确的正则表达式来验证电子邮件非常困难。我认为以下链接应该是适用于所有有效电子邮件的链接,但是该正则表达式长度超过6000个字符... http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html - Hans Olsson
1
限制+号真的很让我烦恼。这意味着你不能使用Google邮件过滤器... - Ian
我认为这可能是一个值得你阅读的链接。这是一篇我从HackerNews上看到的元讨论,我觉得很有趣:http://davidcelis.com/blog/2012/09/06/stop-validating-email-addresses-with-regex/ - Grambot
8个回答

18

其中一个解决方案(不是最好的)是实现一些正则表达式:

^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$

示例:someone@example.com

实际上,编写和维护良好的电子邮件验证正则表达式非常困难。你不能完全信任你的正则表达式。在互联网上,你可以找到很多关于这个问题的文章:


这个在输入有效的电子邮件地址 bob_@hotmail.com 时失败。 - Doug S

11

同时添加必填字段验证器 - 我认为正则表达式验证器只有在该字段中存在文本时才会触发。


必填字段验证器已在问题中使用。用户提出的问题是验证所编写的必填字段验证器中的正则表达式。 - Phani Kumar PV
@Phani Kumar PV - 嗯,不是的。但你让我去看了一下 :) - Paddy
不起作用,因为每个错误都会在页面上留下标签的空间,所以第二个错误会浮动到右侧等等。有什么解决办法吗? - LiamB
1
@Pino - 将验证器的显示属性设置为动态。 - Paddy

1

你需要使用一个额外的验证器 - asp:RequiredFieldValidator

<asp:RequiredFieldValidator runat="server" ControlToValidate="txtEmail" ErrorMessage="Message!" />

基于BaseValidator的任何ASP.NET 2.0验证器(当然除了RequiredFieldValidator本身)都不会检查指定的字段是否为空。

顺便说一下,要使自定义UserControl能够使用这些验证器进行检查,请使用

[System.Web.UI.ValidationProperty("PropertyName")]

1

你不能做出类似这样的吗?

if (txtEmail.Text.Trim().length > 0) then
       validate

我认为由于正则表达式相当复杂,任何可以在正则表达式之外完成的事情都应该在正则表达式之外完成,这样可以使代码更易读,但这只是我的看法。

你的正则表达式非常复杂,在这里你应该找到一个更简单的。无论如何,你可以像这样做:^(regex){1}$


0
void Page_Load(Object sender, EventArgs e)
{
    string uNameExpr = "^[a-zA-Z](.{1,9})$";
    string phoneExpr = 
        "((\\(\\d{3}\\) ?)|(\\d{3}-))?\\d{3}-\\d{4}";

    // Define validation expressions.
    RegExprVal1.ValidationExpression = uNameExpr;
    RegExprVal2.ValidationExpression = phoneExpr;

    ReqFldVal1.Text = "User name is required";
    RegExprVal1.Text = "Must be between 2 to 10 characters";
    RegExprVal2.Text = "Please provide a valid number: (425) 555-0187";
    // ErrorMessages appear in ValidationSummary.
    RegExprVal1.ErrorMessage = "Incorrect UserName format. Name" +
        " can be 2 to 10 characters long";
    ReqFldVal1.ErrorMessage = "User name required";
    RegExprVal2.ErrorMessage = 
        "Please provide a valid number: (000) 000-0000";
}

void OnCmdClick(Object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        ActiveForm = Form2;
    }
}

0
如果你想将该字段视为必填字段,那么最好使用 RequiredFieldValidator。
    <asp:RequiredFieldValidator ID="reqEmail" ControlToValidate="txtEmail" runat="server" ErrorMessage="Email address required"></asp:RequiredFieldValidator>

谢谢,


0

另一个选择是使用 .net 的 CustomValidator,将其 ValidateEmptyText 设置为 True,对于电子邮件地址验证,您可以使用一个 JavaScript 函数,该函数将在验证器的 ClientValidationFunction 属性中指定。


0

这可以通过简单地使用 System.Text.RegularExpressions 中的 Regex 类来完成:

private bool ValidateEmail()
{
    string email = txtemail.Text;
    Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
    Match match = regex.Match(email);
    if (match.Success)
       return true;
    else
       return false;
}

2
.info域名怎么办?这就突显了为什么正则表达式不好。如果你运行一个国家的DNS,最后一部分技术上也可以不需要点,你可以是bob@ly。然后你还可以在子域名下拥有电子邮件,比如bob@foo.lemon.bar.ac.uk。所以这个正则表达式并不能覆盖所有情况。 - PlexQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接