Flutter中如何校验邮箱地址@符号后的内容合法性?
Flutter邮箱@后域名合法性校验实现
你当前写的校验逻辑只覆盖了空输入、不含@两个场景,没有对@拆分后的内容做校验,自然识别不了username@这类@后缺域名的非法格式,按下面的逻辑改就行。
核心修复点
- 删掉第二个分支里重复的
email == null判断,第一个分支已经做过空校验,属于冗余代码 - 校验@的数量:合法邮箱有且仅有1个@,多个@直接判定非法
- 按@拆分字符串为两段:前半段用户名不能为空,后半段域名不能为空、必须带
.后缀,且.不能出现在域名的首尾位置 - 可以给输入自动做
trim()处理,避免用户不小心输入首尾空格导致校验误判
优化后可直接复用的代码
String emailValidator(String email, BuildContext context) { // 空输入必填校验 if (email == null || email.trim().isEmpty) { return AppLocalizations.of(context).translate('validators.requiredField'); } email = email.trim(); // 校验@符号数量 final atSymbolCount = '@'.allMatches(email).length; if (atSymbolCount != 1) { return AppLocalizations.of(context).translate('validators.invalidEmail'); } // 拆分@前后两段 final emailParts = email.split('@'); final usernameSection = emailParts[0]; final domainSection = emailParts[1]; // 用户名段不能为空 if (usernameSection.isEmpty) { return AppLocalizations.of(context).translate('validators.invalidEmail'); } // 域名段校验:非空、包含.、.不在首尾位置 if (domainSection.isEmpty || !domainSection.contains('.') || domainSection.startsWith('.') || domainSection.endsWith('.')) { return AppLocalizations.of(context).translate('validators.invalidEmail'); } return null; }
更简洁的严谨方案
如果不想写这么多分段判断,直接用符合RFC邮箱规范的正则做匹配就行,一行代码覆盖所有非法场景(包括你要的@后无内容的情况):
String emailValidator(String email, BuildContext context) { if (email == null || email.trim().isEmpty) { return AppLocalizations.of(context).translate('validators.requiredField'); } email = email.trim(); // 标准邮箱校验正则,覆盖99%以上的日常邮箱格式场景 final validEmailReg = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'); if (!validEmailReg.hasMatch(email)) { return AppLocalizations.of(context).translate('validators.invalidEmail'); } return null; }
这个正则会自动拦截username@、@qq.com、username@.com、username@qq(域名无后缀)等所有常见非法格式,维护成本更低。
内容的提问来源于stack exchange,提问作者abdulartiBulk
相关产品推荐
相关产品推荐

