我还没有找到这样做的正则表达式。我需要验证电子邮件中的“Message-ID:”值。它类似于电子邮件地址验证regexp,但更简单,没有电子邮件地址允许的大多数边缘情况,来自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) "]"
让我们说outter&lt;&gt;是可选的。可以在rfc2822
中找到点原子文本和缺少的定义我不熟练使用正则表达式,如果存在,我更喜欢使用已经测试过的正则表达式。
答案 0 :(得分:4)
如果有兴趣,我们的一位高级架构师会通过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]))*\])))
答案 1 :(得分:3)
因为我找不到任何我自己最终实现它。根据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();
}
答案 2 :(得分:1)
使用标准正则表达式无法完美匹配RFC2822消息ID,因为CFWS规则允许嵌套注释,正则表达式无法应对。 e.g。
<foo@bar.com> (comment (another comment))
答案 3 :(得分:-3)
尝试像 - &gt; ^ [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] + [A-Z] {2,} $