Per*_*ium 8 regex email rfc2822
我还没有找到一个正则表达式来做到这一点。我需要验证电子邮件中的“消息 ID:”值。它类似于电子邮件地址验证正则表达式,但更简单,没有电子邮件地址允许的大多数边缘情况,来自rfc2822
msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
id-left = dot-atom-text / no-fold-quote / obs-id-left
id-right = dot-atom-text / no-fold-literal / obs-id-right
no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE
no-fold-literal = "[" *(dtext / quoted-pair) "]"
Run Code Online (Sandbox Code Playgroud)
假设外部 <> 是可选的。点原子文本和缺失的定义可以在rfc2822 中找到
我不精通正则表达式,如果存在,我更喜欢使用已经测试过的正则表达式。
如果有人感兴趣,我们的一位高级架构师研究了 RFC 2822 的许多层,并提出了以下正则表达式,其中包括在左侧和右侧引用。规范说新的实现不应该使用过时的字符,所以这个正则表达式不允许它们:
((([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))
Run Code Online (Sandbox Code Playgroud)
由于我找不到任何东西,我最终自己实现了它。这不是根据 RFC2822 进行的正确验证,但目前已经是足够好的近似值:
static String VALIDMIDPATTERN = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*";
private static Pattern patvalidmid = Pattern.compile(VALIDMIDPATTERN);
public static boolean isMessageIdValid(String midt) {
String mid = midt;
if (StringUtils.countMatches(mid, "<") > 1)
return false;
if (StringUtils.countMatches(mid, ">") > 1)
return false;
if (StringUtils.containsAny(mid, "<>")) {
mid = StringUtils.substringBetween(mid, "<", ">");
if (StringUtils.isBlank(mid)) {
return false;
}
}
if (StringUtils.contains(mid, "..")) {
return false;
}
//extract from <>
mid = mid.trim();
//now validate
Matcher m = patvalidmid.matcher(mid);
return m.matches();
}
Run Code Online (Sandbox Code Playgroud)