【问题标题】:Regular expression java pattern doesn't validate?正则表达式java模式不验证?
【发布时间】:2013-02-03 17:29:16
【问题描述】:

正则表达式 "String regex = "[0-9a-z]+@[0-9a-z]+.+[0-9a-z]";" 用于测试电子邮件验证。基本上,我试图做到这一点,以便电子邮件仅以一串字母数字字符开头,然后是 1 @ 符号,然后是另一个字母数字字符字符串,然后是 1 .,最后是一个字母数字字符的字符串。失败的是,当我在最后一个 . 之后输入没有字母数字字符串的电子邮件时,该程序仍将与正则表达式字符串匹配。我该如何做到,以便在 . 之后必须有另一个字母数字字符串?整个代码是:

import java.util.Scanner;
import java.util.regex.*;

public class Regex
{   
    public static void main (String[]args){

        Scanner input = new Scanner(System.in);
        System.out.println("Please enter your Email");
        String mail = input.nextLine();

        String regex = "[0-9a-z]+@[0-9a-z]+.+[0-9a-z]";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(mail);

        if(m.find()) {
            System.out.println("VALID");
        } else {
            System.out.println("INVALD");
        }
    }
}

【问题讨论】:

  • .+ 会给你“至少一个任意字符”。我认为您的意思是在最后一个括号后加上“+”。
  • 对于这类问题,regexper.com是我的首选工具。
  • 您的电子邮件地址正则表达式非常严格。例如,英国电子邮件地址 @example.co.uk 不会验证。电子邮件地址也不会。或 + 在用户部分。查看blog.gerv.net/2011/05/html5_email_address_regexp 以获得更好的(仍然不是完整的规格,但更接近。
  • 您不应使用正则表达式来验证电子邮件地址。

标签: java regex


【解决方案1】:

表达式中的未转义 . 代表任何 字符。您需要使用\\.[.] 来匹配文字点。

String regex = "[0-9a-z]+@[0-9a-z]+[.]+[0-9a-z]";

点后的+ 表示“前面的表达式出现一次或多次”。上面,“先验表达式”是一个点。要匹配电子邮件域地址中的多个段,您需要添加括号:

String regex = "[0-9a-z]+@([0-9a-z]+[.])+[0-9a-z]+";

【讨论】:

  • 我认为 OP 在最后一组括号后忘记了“+”;我怀疑他是否希望地址以一个点后跟一个字母数字结尾。
  • @G.Bach 你说得对,最后没有加号。现在已修复。
  • 他也不希望电子邮件的域地址中有多个段,即使它们完全有效。在任何情况下都不应使用正则表达式来验证电子邮件地址。大错特错。
  • @DavidConrad 为什么会这样?电子邮件地址不是常规语言吗?
  • 也许只是勉强,但是它们有太多的规则和例外,以至于一个合适的正则表达式来匹配它们,如果可能的话,会填满整张 A4 纸,并且完全难以理解和不可维护。但是人们总是开始想“这很简单,我知道电子邮件地址是什么样子的”,然后他们写了类似上面的内容,其中排除了大量完全有效的电子邮件地址。 (也就是说,根据 RFC 2822 有效。)
【解决方案2】:

稍微好一点的正则表达式将包括行首 ^ 和行尾 $ 锚点。

否则,它只需要匹配字符串中有效电子邮件的单个实例,它就会通过。此外,您可以通过添加 {2,4} 将其限制为 2 到 4 个字符,而不是用加号表示 1 或更多。如果没有这些,就像

myemail@gmail.com@thisIsOdd.helloworld.anythingelse

将错误地有效。

String regex = "^[0-9a-z]+@([0-9a-z]+[.])+[0-9a-z]{2,4}$";

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2019-08-03
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多