如何检查输入是否为 Flutter 中的电子邮件地址?

根据 正则表达式文档,我们必须使用 JavaScript(Perl 5)正则表达式: ECMA 规范。在 Dart 中我应该使用什么方法来检查输入是否是电子邮件?

170661 次浏览

我使用这个模式: 在 javascript 中验证电子邮件地址(删除斜线 /分隔符,添加 Dart 分隔符: r' ')。

bool isEmail(String em) {


String p = r'^(([^<>()[\]\\.,;:\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,}))$';


RegExp regExp = new RegExp(p);


return regExp.hasMatch(em);
}

编辑:

要了解更多关于电子邮件验证的信息,请看以下文章: Dominicsayers.comRegular-expressions.info。这个工具可能也非常有用: Gskinner RegExr

编辑: 贾斯汀有一个更好的。我正在使用他提出的模式。

我建议大家对 HTML5电子邮件验证规范进行标准化,它不同于 RFC822,因为它不允许电子邮件地址的几个很少使用的特性(比如评论!),但可以被正则表达式识别。

下面是 HTML5规范中关于电子邮件验证的部分: Http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29

这是正则表达式:

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?)*$

因为这个简单的正则表达式工作得非常好。

const String email = "tony@starkindustries.com"


final bool emailValid =
RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
.hasMatch(email);

我发现的最好的 regEx 模式是 RFC2822电子邮件验证:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

摘自: Regexr.com/2rhq7

我测试的所有其他 regEx 都将字符串 email@email标记为正值,这是假值。

我来到这个页面是为了搜索电子邮件验证,但是这里找到的示例都没有通过我的所有测试。

因此,我决定编写自己的 regEx,从其他答案(站在巨人的肩膀上)中改编了一些概念,到目前为止效果很好:

^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9][a-zA-Z0-9-]{0,253}\.)*[a-zA-Z0-9][a-zA-Z0-9-]{0,253}\.[a-zA-Z0-9]{2,}$

如果你发现这种模式有任何问题,请告诉我。

2019年正确答案

要正确支持 Dart/Flutter 中的电子邮件验证,请参见 pub.dev 包 email_validator

资料来源: https://github.com/fredeil/email-validator.dart

我不知道

这适当地支持:

  • 顶级域名[可选]
  • 国际域名[可选]
  • 经过过滤的域(例如 user + filter@domain.name)
  • 无域地址(例如 user@localhost)

当我搜索这个页面的时候,我已经看到了几次,我想出了一个更简单的正则表达式的省道,这可能有助于那些谁将来到这个页面。

下面是正则表达式:

^[^@]+@[^@]+\.[^@]+

所以在 dart中你可以像

RegExp(r'^[^@]+@[^@]+\.[^@]+')

它只支持普通电子邮件,不支持 TLD。例如,me@email.com 不支持 me@localhost。 希望能有帮助。

在 Dart 中进行电子邮件验证,按照正则表达式:

bool validateEmail(String value) {
Pattern pattern =
r'^(([^<>()[\]\\.,;:\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,}))$';
RegExp regex = new RegExp(pattern);
return (!regex.hasMatch(value)) ? false : true;
}


void main() {
print(validateEmail("aslam@gmail.com"));
}

执行下面的正则表达式:

r'^(([^<>()[\]\\.,;:\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,}))$'

参考资料: https://gist.github.com/aslamanver/3a3389b8ef88831128f0fa21393d70f0

我使用了一个简单而不那么严格的验证器,它也允许 anything@string.comanything@string.co.in域名:

var email = "tony123_90874.coder@yahoo.co.in";
bool emailValid = RegExp(r'^.+@[a-zA-Z]+\.{1}[a-zA-Z]+(\.{0,1}[a-zA-Z]+)$').hasMatch(email);
print (emailValid);

到目前为止,我遇到的最好的正则表达式如下:

R’([ a-z0-9][-a-z0-9 _ + . ] [ a-z0-9]]@([ a-z0-9][-a-z0-9. ][ a-z0-9] . (com | net) | ([0-9]{1,3} . {3}[0-9]{1,3})’)’

这种方法依赖于添加您希望您的用户能够登录的每个域名。

我只是添加了 com 和 net,因为他们是最流行的,但你可以简单地添加更多

艾瑞克贾斯汀的答案中使用 RegExp,
我为 String做了一个扩展方法:

extension EmailValidator on String {
bool isValidEmail() {
return RegExp(
r'^(([^<>()[\]\\.,;:\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,}))$')
.hasMatch(this);
}
}


TextFormField(
autovalidate: true,
validator: (input) => input.isValidEmail() ? null : "Check your email",
)