Java 正则表达式电子邮件
Posted
技术标签:
【中文标题】Java 正则表达式电子邮件【英文标题】:Java regex email 【发布时间】:2012-01-02 12:44:36 【问题描述】:首先,我知道不建议对电子邮件使用正则表达式,但我必须对此进行测试。
我有这个正则表达式:
\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]2,4\b
在 Java 中,我是这样做的:
Pattern p = Pattern.compile("\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]2,4\\b");
Matcher m = p.matcher("foobar@gmail.com");
if (m.find())
System.out.println("Correct!");
但是,无论电子邮件格式是否正确,正则表达式都会失败。 Eclipse 中的“查找和替换”可以使用相同的正则表达式正常工作。
有什么想法吗?
谢谢,
【问题讨论】:
您的正则表达式的一个问题是区分大小写。您应该为您的模式使用 Patterm.compile("...", Pattern.CASE_INSENSITIVE) 构造函数。 为什么不建议在 Java 中使用正则表达式进行电子邮件验证? emailregex.com 使用本网站提供的正则表达式。它声称有 99.99% 正确的电子邮件正则表达式 【参考方案1】:FWIW,这是我们用来验证电子邮件地址的 Java 代码。正则表达式非常相似:
public static final Pattern VALID_EMAIL_ADDRESS_REGEX =
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]2,6$", Pattern.CASE_INSENSITIVE);
public static boolean validate(String emailStr)
Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr);
return matcher.find();
工作相当可靠。
【讨论】:
对于匹配 99.9% 的电子邮件地址的简单解决方案,这是一个很好的解决方案。【参考方案2】:这是适用于 Java 的符合 RFC822 的正则表达式:
Pattern ptr = Pattern.compile("(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*:(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)(?:,\\s*(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*))*)?;\\s*)");
String[] emails = "\"Fred Bloggs\"@example.com", "user@.invalid.com", "Chuck Norris <gmail@chucknorris.com>", "webmaster@müller.de", "matteo@78.47.122.114" ;
for (String email : emails)
System.out.println(email + " is " + (ptr.matcher(email).matches() ? "valid" : "invalid"));
输出:
"Fred Bloggs"@example.com is valid
user@.invalid.com is invalid
Chuck Norris <gmail@chucknorris.com> is valid
webmaster@müller.de is valid
matteo@78.47.122.114 is valid
正则表达式取自这篇文章:Mail::RFC822::Address: regexp-based address validation。结果应该与online version一致。
【讨论】:
【参考方案3】:不要。你永远不会得到一个有效的表达式。
例如,这些都是有效的电子邮件地址:
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@examp le.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
matteo(this is a comment).corti@example.com
root@[127.0.0.1]
只提几个问题:
您没有考虑指定主机的多种形式(例如,通过 IP 地址) 您错过了有效字符 你错过了非 ASCII 域名在开始之前检查相应的 RFC
【讨论】:
带有空格的电子邮件?即使在某个地方决定电子邮件可以有空格,这似乎也很无效。 @MenukaIshan 因为他们声称自己的正则表达式永远不会完全正常。您可以测试上面的几个示例。现在的问题是,为什么要在有有效实现的地方坚持使用 regeres? @Matteo 你能给我这样不需要正则表达式的例子吗?我知道 Hibernate Validator @Email 注释。你说的是那种类型的东西吗?无论如何,我很想知道您的示例,以便我能够在未来的开发中使用它们。谢谢。 使用哪种语言?【参考方案4】:那是因为你忘记了不区分大小写:
Pattern regex = Pattern.compile("\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]2,4\\b");
这与您的示例相匹配,尽管它忽略了许多有效的电子邮件。
【讨论】:
【参考方案5】:验证 99% 电子邮件的另一种简单方法
public static final String EMAIL_VERIFICATION = "^([\\w-\\.]+)1,64@([\\w&&[^_]]+)2,255.[a-z]2,$";
【讨论】:
我喜欢这个,因为它简单易懂,缺少的一件事是国际语言支持(föö@bar.com 现在有效)只需将 \w 切换为 \pL 就可以了任何语言的字母。我最终得到:“^([\pL-_\.]+)1,64@([\pL-_\.]+)2,255.[az]2 ,$"【参考方案6】:这是用于验证电子邮件的有效正则表达式。它完全符合 RFC822 并接受 IP 地址和服务器名称(用于 Intranet 目的)。
public static boolean isEmailValid(String email)
final Pattern EMAIL_REGEX = Pattern.compile("[a-z0-9!#$%&'*+/=?^_`|~-]+(?:.[a-z0-9!#$%&'*+/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", Pattern.CASE_INSENSITIVE);
return EMAIL_REGEX.matcher(email).matches();
以下是一些输出示例,当您调用 isEmailValid(emailVariable)
时:
john@somewhere.com // valid
john.foo@somewhere.com // valid
john.foo+label@somewhere.com // valid (with +label - Gmail accepts it!)
john@192.168.1.10 // valid (with IP addresses)
john+label@192.168.1.10 // valid (with +label and IP address)
john.foo@someserver // valid (with no first domain level)
JOHN.FOO@somewhere.com // valid (case insensitive)
@someserver // invalid
@someserver.com // invalid
john@. // invalid
.@somewhere.com // invalid
【讨论】:
【参考方案7】:是否设置为CASE_INSENSITIVE?
【讨论】:
【参考方案8】:您可以使用此方法在 java 中验证电子邮件地址。
public class EmailValidator
private Pattern pattern;
private Matcher matcher;
private static final String EMAIL_PATTERN =
"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]2,)$";
public EmailValidator()
pattern = Pattern.compile(EMAIL_PATTERN);
/**
* Validate hex with regular expression
*
* @param hex
* hex for validation
* @return true valid hex, false invalid hex
*/
public boolean validate(final String hex)
matcher = pattern.matcher(hex);
return matcher.matches();
【讨论】:
【参考方案9】:一般电子邮件格式 (RE),其中还包括 co.in、co.uk、com、outlook.com 等域。
规则说:
大写和小写英文字母(a-z、A-Z) 数字 0 到 9 字符! # $ % & ' * + - / = ? ^ _ ` | ~ 字符。(点、句号、句号)只要它不是第一个或最后一个 字符,并且还提供它不出现两个或多个 连续多次。
[a-zA-Z0-9]+[._a-zA-Z0-9!#$%&'*+-/=?^_`|~]*[a-zA-Z]*@[a-zA-Z0-9]2,8.[a-zA-Z.]2,6
【讨论】:
【参考方案10】:修改了未验证以“.co.uk”结尾的电子邮件的 Armer B. 答案
public static boolean emailValidate(String email)
Matcher matcher = Pattern.compile("^([\\w-\\.]+)1,64@([\\w&&[^_]]+)2,255(.[a-z]2,3)+$|^$", Pattern.CASE_INSENSITIVE).matcher(email);
return matcher.find();
【讨论】:
【参考方案11】:import java.util.Scanner;
public class CheckingTheEmailPassword
public static void main(String[] args)
String email = null;
String password = null;
Boolean password_valid = false;
Boolean email_valid = false;
Scanner input = new Scanner(System.in);
do
System.out.println("Enter your email: ");
email = input.nextLine();
System.out.println("Enter your passsword: ");
password = input.nextLine();
// checks for words,numbers before @symbol and between "@" and ".".
// Checks only 2 or 3 alphabets after "."
if (email.matches("[\\w]+@[\\w]+\\.[a-zA-Z]2,3"))
email_valid = true;
else
email_valid = false;
// checks for NOT words,numbers,underscore and whitespace.
// checks if special characters present
if ((password.matches(".*[^\\w\\s].*")) &&
// checks alphabets present
(password.matches(".*[a-zA-Z].*")) &&
// checks numbers present
(password.matches(".*[0-9].*")) &&
// checks length
(password.length() >= 8))
password_valid = true;
else
password_valid = false;
if (password_valid && email_valid)
System.out.println(" Welcome User!!");
else
if (!email_valid)
System.out.println(" Re-enter your email: ");
if (!password_valid)
System.out.println(" Re-enter your password: ");
while (!email_valid || !password_valid);
input.close();
【讨论】:
【参考方案12】:感谢@Jason Buberel 的回答,我认为小写字母必须由RegEX 验证。所以以下是正确的:
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]2,6
现在,developer961@mail.com 和 DEV961@yahoo.COM 都有效! 注意 \. 应该是 \\. 才能转义。并拥有 \. 本身。因为 . 在 java 中是一个有意义的字符 RegEX 表示所有字符。
【讨论】:
Jason 的回答使用Pattern.CASE_INSENSITIVE
,所以不需要a-z
【参考方案13】:
我看到这篇文章并尝试了一些答案,但没有找到一个支持我需要的所有东西的答案。
Unicode 字符在我们的例子中,特别是德语 (ÄÖÜäöüß) gmail + 功能:my.gmail+@gmail.com我在https://www.baeldung.com/java-email-validation-regex 找到了完整的模式列表,在那里我找到了 unicode 和 gmail 方法:
uniCodeRegex = "^(?=.1,64@)[\\pL0-9_-]+(\\.[\\pL0-9_-]+)*@"
+ "[^-][\\pL0-9-]+(\\.[\\pL0-9-]+)*(\\.[\\pL]2,)$";
gmailRegex = "^(?=.1,64@)[A-Za-z0-9\\+_-]+(\\.[A-Za-z0-9\\+_-]+)*@"
+ "[^-][A-Za-z0-9\\+-]+(\\.[A-Za-z0-9\\+-]+)*(\\.[A-Za-z]2,)$";
TL,DR: 并通过将 A-Za-z
替换为 \\pL
来组合它们以获取 unicode 字母
combined = "^(?=.1,64@)[\\pL0-9\\+_-]+(\\.[\\pL0-9\\+_-]+)*@"
+ "[^-][\\pL0-9\\+-]+(\\.[\\pL0-9\\+-]+)*(\\.[\\pL]2,)$"
Kotlin 测试示例:
val p = Pattern.compile(patternRegex)
assertThat(p.matcher("user@domain.com").find()).isTrue()
【讨论】:
【参考方案14】:正则表达式:^[\\w!#$%&’*+/=?
|~^-]+(?:\.[\w!#$%&'*+/=?|~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]2,6$
public static boolean isValidEmailId(String email)
String emailPattern = "^[\\w!#$%&’*+/=?`|~^-]+(?:\\.[\\w!#$%&’*+/=?`|~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]2,6$";
Pattern p = Pattern.compile(emailPattern);
Matcher m = p.matcher(email);
return m.matches();
【讨论】:
【参考方案15】:如果你想允许非拉丁字符,这个对我来说效果很好。
"^[\\pL\\pN\\._%+-]+@[\\pL\\pN\\.\\-]+\\.[\\pL]2,$"
它不允许在@ 之后使用IP,但xxx@xxx.TDL
中的大多数有效电子邮件都可以使用它进行验证。
\pL
验证 UTF-Letters,\pN
验证 UTF-Numbers。您可以查看this doc了解更多信息。
【讨论】:
【参考方案16】:试试下面的代码,电子邮件的格式是
jsmith@example.com
第一部分-jsmith
第二部分-@example.com
1. In the 1 part it will allow 0-9,A-Z,dot sign(.),underscore sign(_)
2. In the 2 part it will allow A-Z, must be @ and .
^[a-zA-Z0-9_.]+@[a-zA-Z.]+?\.[a-zA-Z]2,3$
【讨论】:
【参考方案17】:我在regular expression
下方测试了domain
名称中的单个和多个连续点-
([A-Za-z0-9-_.]+@[A-Za-z0-9-_]+(?:\.[A-Za-z0-9]+)+)
这里是上面regex
完全实现的例子。
End_user@live.com
End.u@exm-tech.net
enduser9876@gmail.in
end_user@mywebsite.ac.in.gui
Another984.User2@mail.edu.sg
Another987_User5@mail.show.au
Slow_User@example_domain.au.in
iamthemostsimpleremailhere@example.com
我已尝试通过上面说明的regex
覆盖常用的最大值 email id's validation
,但仍在工作......
如果您仍然知道一些相应使用的email id's
离开了这里,请在评论部分告诉我!
【讨论】:
【参考方案18】:String emailRegex = "[a-zA-Z0-9_.]+@[a-zA-Z0-9]+.[a-zA-Z]2,3[.] 0,1[a-zA-Z]+";
Pattern.matches(emailRegex,"You_Input_Mail_Id");
这是匹配有效电子邮件地址的正则表达式。
【讨论】:
尝试为您的代码添加一些格式和上下文,以帮助未来的读者更好地理解其含义。【参考方案19】:您可以使用简单的正则表达式来验证电子邮件 ID,
public boolean validateEmail(String email)
return Pattern.matches("[_a-zA-Z1-9]+(\\.[A-Za-z0-9]*)*@[A-Za-z0-9]+\\.[A-Za-z0-9]+(\\.[A-Za-z0-9]*)*", email)
说明:
-
[_a-zA-Z1-9]+ - 它将接受所有 A-Z、a-z、0-9 和 _(+ 表示必须出现)
(\.[A-Za-z0-9]) - 可以选择接受 .和 A-Z、a-z、0-9(* 表示其可选)
@[A-Za-z0-9]+ - 它将接受 @ 和 A-Z,a-z,0-9
\.[A-Za-z0-9]+ - 用于 .和 A-Z,a-z,0-9
(\.[A-Za-z0-9]) - 它发生,.但它是可选的
【讨论】:
【参考方案20】:您可以使用此库检查电子邮件是否有效,当然您可以为以下项目添加数组。
import org.apache.commons.validator.routines.EmailValidator;
public class Email
public static void main(String[] args)
EmailValidator email = EmailVlidator.getInstance();
boolean val = email.isValid("george.parcks@gmail.com");
System.out.println("Mail is: "+val);
val = email.isValid("hans.riguer.hotmsil.com");
System.out.print("Mail is: "+val");
输出:
邮件是:是的
邮件是:假
【讨论】:
很高兴它是一个库,但使用的正则表达式非常简单... EMAIL_REGEX = "^\\s*?(.+)@(.+?)\\s*$"; 【参考方案21】:如果您使用 Java Bean Validation,则可以使用 javax.validation.constraints.Email
注释来验证电子邮件。
如果你想手动做,可以看看Hibernate Validator(Java Bean Validation implementation)是怎么做的:
https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/AbstractEmailValidator.java
【讨论】:
【参考方案22】:用于类似 Facebook 的验证的正则表达式:
public static final String REGEX_EMAIL_VALIDATION = "^[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-zA-Z]2,)$";
用于单元测试的 Dto(使用 Lombok):
@Data
@Accessors(chain = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserCreateDto
@NotNull
@Pattern(regexp = REGEX_EMAIL_VALIDATION)
@Size(min = 1, max = 254)
String email;
以下带有单元测试的有效/无效电子邮件:
public class UserCreateValidationDtoTest
private static final String[] VALID_EMAILS = new String[]"email@yahoo.com", "email-100@yahoo.com",
"Email.100@yahoo.com", "email111@email.com", "email-100@email.net",
"email.100@email.com.au", "emAil@1.com", "email@gmail.com.com",
"email+100@gmail.com", "emAil-100@yahoo-test.com", "email_100@yahoo-test.ABC.CoM";
private static final String[] INVALID_EMAILS = new String[]"あいうえお@example.com", "email@111",
"email", "email@.com.my", "email123@gmail.", "email123@.com", "email123@.com.com",
".email@email.com", "email()*@gmAil.com", "eEmail()*@gmail.com", "email@%*.com", "email..2002@gmail.com",
"email.@gmail.com", "email@email@gmail.com", "email@gmail.com.";
private Validator validator;
@Before
public void setUp() throws Exception
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
@Test
public void emailValidationShouldBeValid() throws Exception
Arrays.stream(VALID_EMAILS)
.forEach(email ->
Set<ConstraintViolation<UserCreateDto>> violations = validateEmail(
new UserCreateDto().setEmail(email));
System.out.println("Email: " + email + ", violations: " + violations);
Assert.assertTrue(violations.isEmpty());
);
@Test
public void emailValidationShouldBeNotValid() throws Exception
Arrays.stream(INVALID_EMAILS)
.forEach(email ->
Set<ConstraintViolation<UserCreateDto>> violations = validateEmail(
new UserCreateDto().setEmail(email));
System.out.println("Email: " + email + ", violations: " + violations);
Assert.assertTrue(!violations.isEmpty());
);
private Set<ConstraintViolation<UserCreateDto>> validateEmail(UserCreateDto user)
String emailFieldName = "email";
return validator.validateProperty(user, emailFieldName);
【讨论】:
以上是关于Java 正则表达式电子邮件的主要内容,如果未能解决你的问题,请参考以下文章