我有一个代码检查用户输入在正则表达式模式中是否有效。模式是@问题是如何检查字符。连续出现
[A-Z|A-Z|0-9|[.]{1}]+@[[a-z|A-Z|0-9]+到目前为止,我已经尝试过这种模式。
System.out.print("Enter your Email: ");
String userInput = new Scanner(System.in).nextLine();
Pattern pat = Pattern.compile("[a-z|A-Z|0-9|[.]{1}]+@[a-z|A-Z|0-9]+");
Matcher mat = pat.matcher(userInput);
if(mat.matches()){
System.out.print("Valid");
}else{
System.out.print("Invalid");
}
}
}
如果输入是 een..123@asd123我希望输出无效,但如果输入een.123@asd123则输出将有效
字符类匹配任何列出的字符。如果指定管道|
并不意味着OR
但它也可以匹配|
。
如果不想匹配连续的点,可以使用不包含点的字符类,然后使用量词重复以点开头的分组结构。
^[a-zA-Z0-9]+(?:.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:.[a-zA-Z0-9]+)*$
这将匹配
-
^
字符串开头 -
[a-zA-Z0-9]+
匹配 1+ 乘以字符类中列出的任何角色 - 匹配字符类中列出的 1+ 次,以防止出现连续的点。
-
@
匹配@
字符 -
[a-zA-Z0-9]+
再次匹配 1+ 字符 -
(?:.[a-zA-Z0-9]+)*
再次匹配重复组 -
$
字符串结尾
(?:.[a-zA-Z0-9]+)*
重复 0+ 次以点开头的组,并正则表达式 101 演示
如果您不想要连续的句点,请使用[a-zA-Z0-9]+(?:.[a-zA-Z0-9]+)*
解释
[a-zA-Z0-9]+ Match one or more letters or digits
(?: Start non-capturing group
. Match exactly one period
[a-zA-Z0-9]+ Match one or more letters or digits
)* End optional repeating group
使用此模式,值不能以句点开头或结尾,并且不能有连续句点。
或者,使用负面的前瞻:(?!.*[.]{2})[a-zA-Z0-9.]+@[a-zA-Z0-9]+
解释
(?!.*[.]{2}) Fail match if 2 consecutive periods are found
[a-zA-Z0-9.]+@[a-zA-Z0-9]+ Match normally