电子邮件地址长度验证的正则表达式

3
我们有一个文本框,可以接受逗号分隔的电子邮件地址。正则表达式为:
^(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*\s*[,]?\b)*$.
但现在我无法将长度验证添加到此表达式中。每个电子邮件地址的长度不应超过150个字符。我尝试了:
^((\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)){1,150}\s*[,]?\b)*$. 
但它不起作用。请修改正则表达式,以便它也实现此验证。

1
你用什么来显示表单?在文本字段上设置大小属性可能更容易。例如,在HTML中 <textfield size="20"/> - krock
文本字段接受逗号分隔的电子邮件地址,例如 gg@gg.com,tt@tt.com。必须对每个单独的电子邮件地址进行长度验证。每个电子邮件地址的长度不应超过150个字符。因此我无法在文本字段上设置大小属性。 - Mini
2
为什么将电子邮件地址限制在150个字符以内?这对我来说似乎相当武断。 - sarnold
可能是为了适应数据库列的大小。这个限制似乎相当高 - 我怀疑很多地方的限制都低于这个值。 - Peter Boughton
5个回答

5

为什么要使用正则表达式,而不是简单地检查字符串的长度?如果必须使用,则可以使用第二个正则表达式:

^.{1,150}$

1
我选择了这种方式(添加第二个验证器表达式),因为您确实希望这些验证器有两个不同的消息。如果有人输入了一个151个字符的电子邮件地址,而消息显示电子邮件格式无效,那是没有帮助的。最好有第二个消息,显示“地址太长”。 - Tony L.

5

使用预查

/(?=^.{1,150}$)(your regex goes here)/

1

我宁愿不要让这个正则表达式变得更加复杂,并在检查电子邮件匹配之前添加显式长度检查。在JavaScript中,它将类似于以下内容:

function validateEmail(email) {
    var regex = /^(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*\s*[,]?\b)*$/;
    // 20 is used instead of 150 for sake of example
    return email.length <= 20 && regex.test(email);
}
// validateEmail("jdoe@example.com") == true
// validateEmail("loooooooooooooooooooonjohn@example.com") == false

顺便说一下,在你的正则表达式中,$后面的点似乎是一个错误,所以我在我的片段中跳过了它。

认为最好实现这个功能。本来想不使用JavaScript验证和警告框来完成,因为页面上的其他文本框都有验证器来显示错误消息。然而,我认为在这方面没有选择余地。 - Mini
还有一件事。文本框接受逗号分隔的电子邮件地址。因此,返回 email.length <= 20 && regex.test(email); 这个条件不起作用。我将需要拆分并逐个检查每个电子邮件地址的长度。 - Mini
当然,我的意思是单个电子邮件而不是整个文本框的内容。所以,是的,你需要拆分。 - Rorick

0

我来到这里是为了寻找一种扩展Angular表单中电子邮件ng-pattern的方法。

采用Rorick的方法分别检查长度,我发现了一个更简单的解决方案:只需在输入框中设置ng-maxlength="150"。然后,您可以自定义错误消息,告诉用户电子邮件太长了。

maxlength="150"也可以正常工作,防止任何额外的字符被添加到字段中,但我喜欢ng-maxlength告诉您出了什么问题,而不是截断您的字符串。


0
^([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]){0,70}$

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