Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证电子邮件(不发送确认) 验证电子邮件不是一个选项:(_Java_Regex_Validation_Email Validation - Fatal编程技术网

Java 验证电子邮件(不发送确认) 验证电子邮件不是一个选项:(

Java 验证电子邮件(不发送确认) 验证电子邮件不是一个选项:(,java,regex,validation,email-validation,Java,Regex,Validation,Email Validation,我有一套非常具体的规则,需要用来验证电子邮件地址。我尝试过Apache Commons库和JavaMail库;虽然这两个库都符合RFC 2822,但根据我的规则,一些无效的电子邮件会通过。我一直在试着用regexes(regexi?)来验证我的运气无济于事。我知道,我知道。正则表达式不是最好的选择,可能会花费大量时间并增加复杂性。不过,我认为,因为我用不太难的术语概括了规则,所以为这个特定实例构建一个正则表达式就足够了 规则: 电子邮件地址的本地部分可以使用以下任何一种: 大小写字母 数字0-

我有一套非常具体的规则,需要用来验证电子邮件地址。我尝试过Apache Commons库和JavaMail库;虽然这两个库都符合RFC 2822,但根据我的规则,一些无效的电子邮件会通过。我一直在试着用regexes(regexi?)来验证我的运气无济于事。我知道,我知道。正则表达式不是最好的选择,可能会花费大量时间并增加复杂性。不过,我认为,因为我用不太难的术语概括了规则,所以为这个特定实例构建一个正则表达式就足够了

规则:
  • 电子邮件地址的本地部分可以使用以下任何一种:
    • 大小写字母
    • 数字0-9
    • 特殊字符:,!#$%^&*()`+=-{}~
    • 句点,但不能以句点开始或结束
    • 不能包含连续的句点
  • 电子邮件的本地部分和域部分之间必须有At符号(@)
  • 域只能包含字母、数字、下划线、句点和连字符
    • 不能以连字符开头
    • 不能以连字符结尾
    • 不能包含两个连续的连字符
  • 域和电子邮件的TLD部分之间必须有一个时间段
    • TLD必须仅包含字母
    • TLD不得以句点结束
  • 到目前为止,我一直在尝试使用以下正则表达式:

    ^((?!。{2}.[^.][-a-zA-Z0-9\!\\\\\\\\\\\\$\\\\\\&*(\)\,\'\+\=\\\\\\\\\\\\\-]+[^.]@((?!.\-{2,}.[^-][a-zA Z0-9\\+[^-+[^-]$

    对于无效电子邮件(例如。justlikethat@gm--www.ail.com)

    我在正则表达式上遗漏了什么或做错了什么?有没有其他方法可以确保电子邮件在没有正则表达式的情况下符合要求

    提前谢谢


    另外,这是Java语言,因此上述正则表达式中的所有转义字符都必须进行双转义(例如,
    \.
    \.
    )。由于我显然不是正则表达式大师,我也一直在使用它来帮助我形象化这一点。

    普遍的看法是,电子邮件对于单个正则表达式来说太复杂了。通过查看SMTP服务器是否可以发送电子邮件地址来检查电子邮件地址更容易。您已经被告知了这一点

    因此,假设您需要预先验证一个地址(并且假设它只是电子邮件部分,而不是您可以拥有的所有商品,如unicode名称等),那么我的建议是:

  • 把问题分解成更小的部分
  • 给每个部分一个方法
  • 验证每个部分(可能在循环中)
  • 使用正则表达式和标准逻辑的组合来确保它是有效的(根据您的规则)
  • 这是留下一个合理的系统的唯一现实的方法,这个系统可以被那些下次看到代码的可怜虫维护和理解

    e、 g


    一般的看法是,电子邮件对于单个正则表达式来说太复杂了。通过查看SMTP服务器是否可以发送电子邮件地址来检查电子邮件地址更容易。您已经被告知了这一点

    因此,假设您需要预先验证一个地址(并且假设它只是电子邮件部分,而不是您可以拥有的所有商品,如unicode名称等),那么我的建议是:

  • 把问题分解成更小的部分
  • 给每个部分一个方法
  • 验证每个部分(可能在循环中)
  • 使用正则表达式和标准逻辑的组合来确保它是有效的(根据您的规则)
  • 这是留下一个合理的系统的唯一现实的方法,这个系统可以被那些下次看到代码的可怜虫维护和理解

    e、 g


    我建议:

    @
    符号上拆分。在最后一个句点上拆分(使用and)。现在本地部分、域和TLD都在单独的字符串中,请使用if语句进行验证。是否有任何规则适用于所有句点(连续两个句点?),在拆分之前执行此操作。更易于正确操作,更易于理解,更易于维护

    但是,如果你真的想坚持使用正则表达式,我看到了一些事情:

    @
    前面的
    [^.]
    应该是
    (?),否则
    @
    前面的最后一个字符几乎可以是任何字符

    只是一个字符,所以
    (?!.\-{2,}。)
    (?!.\.{2,}。)
    不做你认为它做的事。只做
    *
    似乎可以修复它。而且你不需要检查你要找的东西后面的任何字符

    它还没有明确说明,但我假设域和TLD也不能包含两个连续的句点。如果允许,正则表达式的第一部分需要是
    (?!.\.{2,}.*@)
    ,才能在
    @
    处停止

    如果使用,则不需要使用
    ^
    $

    有一些不必要的
    ()

    最终正则表达式:

    (?!!.\.{2,})[^.][-a-zA-Z0-9.!@$%^&*(),'+=`{124;}-]+(?)?
    如果您选择坚持使用正则表达式,我建议您多加评论:

    字符串正则表达式=
    “(?!.\\\.{2,})”//不包含2个连续的。”
    //局部
    +“[^.]”//不是以字母开头的。
    +“[-a-zA-Z0-9.!@$%^&*(),'+=`{124;}~-]+'//本地部分的有效字符
    
    +“(?我建议:

    @
    符号上拆分。在最后一个句点上拆分(使用and)。现在本地部分、域和TLD都在单独的字符串中,请使用if语句进行验证。是否有任何规则适用于所有句点(连续两个句点?),在拆分之前执行此操作。更易于正确操作,更易于理解,更易于维护

    但是,如果你真的想坚持使用正则表达式,我看到了一些事情:

    @
    前面的
    [^.]
    应为
    (?),否则为最后一个字符
    
    ^((?!.\.{2,}.)[^.][-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+[^.])@((?!.\-{2,}.)[^-_][-a-zA-Z0-9_.]+[^-_]\.[a-zA-z]+)$
    
    private void validateNamePart(String npart) {
      if (!npart.matches("")) {
        throw new .....;
      }
    }
    
    private void validateName(String name) {
      int parts = 0;
      for (String npart : name.split("\\.")) {
        validateNamePart(npart);
        parts++;
      }
      if (parts == 0) {
         throw ....;
      }
    }
    
    private void validateDomainPart(String dpart) {
      ....
    }
    
    private void validateDomain(String domain) {
      ....
    }
    
    public void validateEMail(String email) {
      String parts = email.split("@");
      if (parts.length == 2) {
        validateName(parts[0]);
        validateDomain(parts[1]);
      } else {
        throw ....
      }
    }