Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]
Posted
技术标签:
【中文标题】Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]【英文标题】:Java 8/11+ validate email address syntax w/o Pattern? [duplicate] 【发布时间】:2021-03-02 08:07:11 【问题描述】:编辑:显然,我在这里所做的是禁忌。 ???生活吧。
我知道 SO 上的答案至少与电子邮件的 RFC 一样多,而且我对这个问题有自己的答案,我想将其公之于众以获取反馈。我的应用程序应如何确保任意字符串包含一个有效的电子邮件地址?
为了避免愚蠢的辩论,假设要扫描的文本必须少于 1KB。 库 X 与 vanilla Java 8/11+ 的拥护者应该解释哪个以及为什么。 我认为有效的电子邮件地址示例:äöüëèéê@xkcd.com
// "valid" means worth attempting to send welcome message
static boolean isValidEmailAddress(String notNull);
【问题讨论】:
发帖前一定要彻底搜索 Stack Overflow。 Java 使用真假,而不是真假。 嘿,伙计们。我确实搜索了堆栈;在我诚实的意见中,与此相关的问题并没有很好地提出或回答。而且,@NomadMaker:Boolean.TRUE 和 Boolean.FALSE 是 Java 中的绝对常量,可以取消装箱为真/假位。感谢您的澄清。 【参考方案1】:简单的问题,复杂的答案;搜索 Stack Overflow 会产生很多争论和实践知识。
但是,我有一个精辟的反驳:您是否考虑过发送消息,看看谁回信?其他:
-
首先,施加任何长度限制以及您喜欢的任何明确的允许/阻止列表。
接下来,只要您使用的是 Java 8 或更高版本,请考虑使用
jakarta.mail
。
完全避免使用正则表达式,但如果必须,这样做:
private static final String NLP = Pattern.compile("[\\pAlnum\\pPunct&&[^@]]+").pattern();
private static final Pattern VALID_ENOUGH_EMAIL_ADDRESS =
Pattern.compile(String.join("@", NLP, NLP), Pattern.UNICODE_CHARACTER_CLASS);
用简单的英语:在一个文字 @
的任一侧,“除文字 @
之外的任何数字或字母或标点符号,至少一次”。
脚注:
该库声称实现了已被取代的 RFC822。两次。而且,它可能会一次又一次。
https://eclipse-ee4j.github.io/mail/
public static void boolean isValidEmailAddress(String notNull)
// impose whatever extra pre-flight check you like on ^^^
try
new InternetAddress(notNull, true); // v2.0.0 works w/ Unicode
return true;
catch (AddressException e)
// log or recover however you want
return false;
注意,这可能会接受不是大多数系统识别的单个有效电子邮件地址的邮件;如果您的系统有独特的要求,请参阅那些。 如果没有,您可能可以使用适当的模式为@Email
使用 Java/Spring 验证注释,而不是编写与表情符号和变音符号有关的自己的实现,谁知道 2020 年还有什么?超越。
https://en.wikipedia.org/wiki/International_email
【讨论】:
以上是关于Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章