我有一个代码检查用户输入在正则表达式模式中是否有效。模式是@问题是如何检查字符。连续出现
[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,输出将有效
答案 0 :(得分:1)
如果您不想连续使用,请使用[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
答案 1 :(得分:1)
字符类与任何列出的字符匹配。如果您指定的管道|
并不代表OR
,但它也可以匹配|
。
如果不想匹配连续的点,可以使用不包含点的character class,然后使用量词重复以点开头的分组结构。 / p>
^[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$
这将匹配
^
字符串的开头[a-zA-Z0-9]+
匹配charater类中列出的任何字符1次以上(?:\.[a-zA-Z0-9]+)*
对一个以点开始的组重复0+次,并与字符类中列出的字符相匹配的1+倍,以防止出现连续的点。@
匹配@ char [a-zA-Z0-9]+
再次匹配1个以上的字符(?:\.[a-zA-Z0-9]+)*
再次匹配重复组$
字符串结尾