没有人提到本地化(i18n)的问题。如果你的客户来自世界各地,该怎么办呢?
你需要根据每个国家/地区对正则表达式进行细分,我曾经见过开发人员建立一个大型字典或配置。检测用户的浏览器语言设置可能是一个很好的起点。
不匹配:
如果符合RFC 2821和2822标准,您可以使用以下内容:
^((([!#$%&'*+\-/=?^_`{|}~\w])|([!#$%&'*+\-/=?^_`{|}~\w][!#$%&'*+\-/=?^_`{|}~\.\w]{0,}[!#$%&'*+\-/=?^_`{|}~\w]))[@]\w+([-.]\w+)*\.\w+([-.]\w+)*)$
"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
using System.Text.RegularExpressions;
private bool IsValidEmail(string email) {
bool isValid = false;
const string pattern = @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
isValid = email != "" && Regex.IsMatch(email, pattern);
// Same above approach in multiple lines
//
//if (!email) {
// isValid = false;
//} else {
// // email param contains a value; Pass it to the isMatch method
// isValid = Regex.IsMatch(email, pattern);
//}
return isValid;
}
该方法用于验证传入参数中的电子邮件字符串。 当参数为null、空字符串、undefined或参数值不是有效的电子邮件地址时,它将返回false。 只有当参数包含有效的电子邮件地址字符串时,它才会返回true。
simon-@hotmail.com
我曾经遇到一个真实客户的电子邮件地址就是这种格式,他无法下订单。 MailAddress
构造函数进行额外的检查(见下文):.cmo
或.gmial.com
并要求确认"Are you sure this is your correct email address. It looks like there may be a mistake." 如果用户确��输入正确,则允许用户接受所输内容。try
{
var email = new MailAddress(str);
if (email.Host.EndsWith(".cmo"))
{
return EmailValidation.PossibleTypo;
}
if (!email.Host.EndsWith(".") && email.Host.Contains("."))
{
return EmailValidation.OK;
}
}
catch
{
return EmailValidation.Invalid;
}
.gmial.com
” 的示例不在示例代码中。 - Peter Mortensenpublic static boolean isEmailValid(@NonNull String email) {
return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
就正则表达式而言,我总是使用这个正则表达式来解决我的问题。
"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}"
如果你想通过匹配电子邮件正则表达式从字符串中找到所有的电子邮件地址。你可以在这个链接找到一个方法。
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
^.+@\w+(\.\w+)+$
这是我建立的一个版本。它不是万无一失的,但它很“简单”且几乎检查了所有内容。
[\w+-]+(?:\.[\w+-]+)*@[\w+-]+(?:\.[\w+-]+)*(?:\.[a-zA-Z]{2,4})
我认为有必要解释一下,以便您在需要时进行修改:
(e) [\w+-]+
匹配至少一次a-z、A-Z、_、+、-。
(m) (?:\.[\w+-]+)*
匹配以点(.)开头,后面跟零个或多个a-z、A-Z、_、+、-
@
= @
(i) [\w+-]+
匹配至少一次a-z、A-Z、_、+、-。
(l) (?:\.[\w+-]+)*
匹配以点(.)开头,后面跟零个或多个a-z、A-Z、_、+、-
(com) (?:\.[a-zA-Z]{2,4})
匹配以点(.)开头,后面跟2到4个a-z、A-Z的字符。
得出的结果为 e(.m)@i(.l).com
,其中 (.m)
和 (.l)
是可选的,也可以重复多次。
我认为这个正则表达式可以验证所有有效的电子邮件地址,但不使用过于复杂的正则表达式来阻止潜在的无效电子邮件地址,在大多数情况下也不需要这样做。
请注意,这将允许 +@-.com
,但这是为了保持简单而做出的妥协。
Mail::RFC822::Address
的答案显然是正确的),用于 电子邮件发送实用程序。我选择了这个(我是一个 POSIX 正则表达式人,所以我通常不使用来自 PCRE 的 \d
等,因为它们让事情对我来说不太可读):preg_match("_^[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*@[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?)*\$_", $adr)
{something}@{something}.{something}
的电子邮件结构。没有必要使用详细的正则表达式,因为您将无法全部捕获,并且几年后会有一批新的数据,您将不得不再次更新正则表达式。我决定使用正则表达式,因为不幸的是,一些用户不阅读表格并将错误的数据放入错误的字段中。当他们尝试将不是电子邮件的内容放入电子邮件输入字段时,这将至少提醒他们,并应该节省您处理有关电子邮件问题的时间。
(.+)@(.+){2,}\.(.+){2,}