句点不能在String Java中连续出现

时间:2019-04-01 16:35:04

标签: java regex

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

[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,输出将有效

2 个答案:

答案 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]+)*再次匹配重复组
  • $字符串结尾

Regex101 demo