验证Dart中的电子邮件地址?

Eri*_*oie 16 regex email email-validation dart

根据RegExp文档,我们必须使用"JavaScript"(Perl 5)正则表达式:Ecma Specification.您使用什么模式进行电子邮件验证?

763*_*763 57

使用EricJustin的答案中的 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);
  }
}

Run Code Online (Sandbox Code Playgroud)
TextFormField(
  autovalidate: true,
  validator: (input) => input.isValidEmail() ? null : "Check your email",
)
Run Code Online (Sandbox Code Playgroud)


Air*_*ark 31

对于那个简单的正则表达式非常有效。

var email = "tony@starkindustries.com"
bool emailValid = RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(email);
Run Code Online (Sandbox Code Playgroud)

  • 很酷,但我拥有一个有效的电子邮件:xxx@xxx-xx.com,所以破折号不会通过。这将允许 '@' RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&amp;'*+-/=?^_ `{|}~]+@[a-zA-Z0-9-]+\.[a-zA-Z]+") (10认同)
  • 最佳答案在这里。如果您无法识别*所有*有效的电子邮件,最好保持宽容,不要让您的用户感到沮丧。 (7认同)
  • 除此之外,该正则表达式不允许在域名中使用连字符:qweqwe@qwe-qwe.qw (6认同)
  • 对于在发帖时将其视为最高投票答案的人来说,这不接受“name+filter@domain.com”,这是有多少用户会自动过滤收件箱中的电子邮件。因此,除非您想惹恼他们,否则不要使用此功能。如果您想要最宽松的正则表达式,请使用接受的答案。简单!==最好。 (5认同)
  • 注意 `test@subdomain.domain.com` 将**不**工作 (2认同)

Jus*_*ani 15

我建议每个人都对HTML5电子邮件验证规范进行标准化,这与RFC822不同,它禁止使用几个很少使用的电子邮件地址功能(如评论!),但可以被正则表达式识别.

以下是HTML5规范中有关电子邮件验证的部分:http: //www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state - %28type =电子邮件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])?)*$
Run Code Online (Sandbox Code Playgroud)

  • 它对 a@a 有效 (8认同)
  • 有点晚了,但是......它不起作用 - 它对“s@s”字符串有效。 (4认同)
  • 这与我粘贴的模式相同,但我没有将其标记为代码,因此它被转义了。如果它仍然无法验证电子邮件地址,那么 W3C 需要解决这个问题:) (2认同)
  • 虽然这是页面上列出的那个,但它允许`anything@anything`,这似乎是一个很大的疏忽,因为据我所知,没有任何有效的电子邮件地址。 (2认同)
  • 根据标准,它们在技术上都是有效的。https://serverfault.com/a/721929/530945 然而,[ICANN 确实在 2013 年制定了针对无点域名的规则。](https://www.icann.org/news/announcement-2013-08-30-en ) [Google 希望更改哪些内容。](https://www.theregister.co.uk/2016/07/12/google_one_word_domains/) (2认同)

Eri*_*oie 13

我使用这种模式:validate-email-address-in-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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

有关电子邮件验证的更多信息,看看这些帖子:dominicsayers.comregular-expressions.info.这个工具也可能非常有用:gskinner RegExr.

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


小智 12

我使用了一个简单但不那么严格的验证器,它也允许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);
Run Code Online (Sandbox Code Playgroud)


Dav*_*d_E 9

我发现的最佳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为正,这是假的。


Goo*_*ian 9

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"));
}
Run Code Online (Sandbox Code Playgroud)

流下面的正则表达式:

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,}))$'
Run Code Online (Sandbox Code Playgroud)

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


Lan*_*nce 8

2019正确答案

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

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

_

这正确地支持:

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