根据 正则表达式文档,我们必须使用 JavaScript(Perl 5)正则表达式: ECMA 规范。在 Dart 中我应该使用什么方法来检查输入是否是电子邮件?
JavaScript
Perl 5
我使用这个模式: 在 javascript 中验证电子邮件地址(删除斜线 /分隔符,添加 Dart 分隔符: r' ')。
/
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.com和 Regular-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标记为正值,这是假值。
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。
email_validator
资料来源: https://github.com/fredeil/email-validator.dart
我不知道
这适当地支持:
当我搜索这个页面的时候,我已经看到了几次,我想出了一个更简单的正则表达式的省道,这可能有助于那些谁将来到这个页面。
下面是正则表达式:
^[^@]+@[^@]+\.[^@]+
所以在 dart中你可以像
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.com和 anything@string.co.in域名:
anything@string.com
anything@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做了一个扩展方法:
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", )