句点不得在字符串 Java 中连续出现



我有一个代码检查用户输入在正则表达式模式中是否有效。模式是@问题是如何检查字符。连续出现

[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+ 乘以字符类中列出的任何角色
  • (?:.[a-zA-Z0-9]+)* 重复 0+ 次以点开头的组,并
  • 匹配字符类中列出的 1+ 次,以防止出现连续的点。
  • @匹配@
  • 字符
  • [a-zA-Z0-9]+ 再次匹配 1+ 字符
  • (?:.[a-zA-Z0-9]+)* 再次匹配重复组
  • $ 字符串结尾

正则表达式 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

最新更新