`
duguyidao
  • 浏览: 138452 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

regular expression/regex(4)Validating E-mail Address with regular expression

阅读更多
使用正则表达式验证电子邮件地址

    首先附加上Java编程语言和正则表达式文章(Regular Expresssion and the Java Programming Language)上用于验证电子邮件地址的代码:

/*
* Checks for invalid characters
* in email addresses
*/
public class EmailValidation {
   public static void main(String[] args)
                                 throws Exception {
                                
      String input = "@sun.com";
      //Checks for email addresses starting with
      //inappropriate symbols like dots or @ signs.
      Pattern p = Pattern.compile("^\\.|^\\@");
      Matcher m = p.matcher(input);
      if (m.find())
         System.err.println("Email addresses don't start" +
                            " with dots or @ signs.");
      //Checks for email addresses that start with
      //www. and prints a message if it does.
      p = Pattern.compile("^www\\.");
      m = p.matcher(input);
      if (m.find()) {
        System.out.println("Email addresses don't start" +
                " with \"www.\", only web pages do.");
      }
      p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
      m = p.matcher(input);
      StringBuffer sb = new StringBuffer();
      boolean result = m.find();
      boolean deletedIllegalChars = false;

      while(result) {
         deletedIllegalChars = true;
         m.appendReplacement(sb, "");
         result = m.find();
      }

      // Add the last segment of input to the new String
      m.appendTail(sb);

      input = sb.toString();

      if (deletedIllegalChars) {
         System.out.println("It contained incorrect characters" +
                           " , such as spaces or commas.");
      }
   }
}
    熟悉java语言的一看就知道Regular Expression and the Java Programming Language 这篇文章中主要是检查电子邮件地址中的非法字符。由于代码中注释已经很清楚了,所以下面就讲述一个直接检查正则表达式是否正确的情况。

    由于现在网络域名的变更,给电子邮件地址的验证增加了负担,例如:现在有了.museum的顶级域名,它很不同于以前的顶级域名例如:.com/.cn/.org等,所以我们在书写正则表达式的时候就不能设置最后的字符长度为{2,4},而当我们把这个长度扩大之后,就又引起了另外一个问题:非法的邮件地址也被视为正确。所以有的人称这种方式为:Trade-offs(交换,协定)。以下给出一个可以验证99%的邮件地址的正则表达式:
    [A-Za-z0-9._%#~-]+@[A-Za-z0-9_.-]+\.[A-Za-z]{2,4}  当然你也可以用\w替换 [A-Za-z_0-9],就变成了下面的形式:[\w\.%#~-]+@[\w.-]+\.[A-Za-z]{2,4}。当然这个例子不能匹配到.museum。 如果要包含.museum,你可以使用[\w\.%#~-]+@[\w.-]+\.[A-Za-z]{2,6}然而,现在又出现了一个问题,这个正则表达式匹配john@main.office 更多可能的是john忘记了加入.com顶级域名而不是自己创建了一个.office的顶级域名,这个域名没有得到ICANN的批准。
    这样就产生了另外一个(trade-off)协定。你想要这个正则表达式去检查是否这个顶级域名存在?任何有2-4个字符的结合将要这样做,它几乎涵盖了所有现存的和计划过的顶级域名除了.museum。但是,它也匹配有违法的顶级域名像:asdf@asf.asdf。此表达式没有过度的对顶级域名进行限制。你如果想要你的正则表达式的准确率提高,你必须更新你的正则表达式只要有新的顶级域名被创建,不管这个顶级域名是国家代码或者所属于某个领域。
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.(?:[A-Za-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)$ 这个表达式可以允许任意两个字符国家代码的顶级域名,和仅有的几个具体类别的顶级域名。在你读这篇文章的时候,可能这个表达式已经过时了。如果你使用这个正则表达式,我推荐你将它存储为你应用程序的全局常量,这样你以后只要修改这个地方就可以了。你也可以使用同样的方式列出来所有的国家代码,尽管有大约200个国家代码。
    电子邮件也可能在子域的服务器上,例如:john@server.department.company.com。以上所有的正则表达式都匹配这个电子邮件,因为我包含了一个.(dot)在@符号后面的字符类里面,然而,这个正则表达式也匹配john@...com,但是这个不是有效的电子邮件,因为有连续的..(dot)。你可以在上面任意的一个正则表达式里使用(?:[A-Za-z0-9-]+\.)+ 来替代[A-Za-z0-9.-]+\.来排除上面的邮件地址。我把.(dot)从字符类里面移除来了,取而代之的是使用一个字符类后面紧跟一个.(dot)。例如:\b[A-Za-z0-9._%+-]+@(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,4}\b会匹配john@server.department.company.com而不匹配john@aol...com。
    另外一个trade-off(交换,协定)是正则表达式只允许英文字体,数字和一写特殊符号。主要的原因是我不相信所有我的电子邮件软件能够处理的更过情况。尽管John.O'Hara@theoharas.com是个语义有效的电子邮件,但是有个风险就是有的软件将撇号误解析为受限的引号。例如:盲目的将电子邮件插入到SQL将会失败,因为单引号是受限的。当然,域名包含有非英文字符已经好几年了。大部分的软件甚至是域名注册者仍然使用他们习惯使用的37个字符。
    结论:决定使用哪个或那种正则表达式来验证电子邮件,是否你要努力匹配一个电子邮件地址或者是一些模糊定义的地址。你需要考虑这种trade-off。匹配了一个不合法的邮件地址有多糟糕?没有去匹配一些合法的邮件有多糟糕?你的正则表达式有多么复杂?你以后要改变你的正则表达式将要花费多少成本?对于以上问题的不同的答案,你可能需要不同的正则表达式作为解决方案。
    以下简单附属了官方的对于邮件规定的 RFC2822标准:
The Official Standard: RFC 2822

Maybe you're wondering why there's no "official" fool-proof regex to match email addresses. Well, there is an official definition, but it's hardly fool-proof.

The official standard is known as RFC 2822. It describes the syntax that valid email addresses must adhere to. You can (but you shouldn't--read on) implement it with this regular expression:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

This regex has two parts: the part before the @, and the part after the @. There are two alternatives for the part before the @: it can either consist of a series of letters, digits and certain symbols, including one or more dots. However, dots may not appear consecutively or at the start or end of the email address. The other alternative requires the part before the @ to be enclosed in double quotes, allowing any string of ASCII characters between the quotes. Whitespace characters, double quotes and backslashes must be escaped with backslashes.

The part after the @ also has two alternatives. It can either be a fully qualified domain name (e.g. regular-expressions.info), or it can be a literal Internet address between square brackets. The literal Internet address can either be an IP address, or a domain-specific routing address.

The reason you shouldn't use this regex is that it only checks the basic syntax of email addresses. john@aol.com.nospam would be considered a valid email address according to RFC 2822. Obviously, this email address won't work, since there's no "nospam" top-level domain. It also doesn't guarantee your email software will be able to handle it. Not all applications support the syntax using double quotes or square brackets. In fact, RFC 2822 itself marks the notation using square brackets as obsolete.

We get a more practical implementation of RFC 2822 if we omit the syntax using double quotes and square brackets. It will still match 99.99% of all email addresses in actual use today.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

A further change you could make is to allow any two-letter country code top level domain, and only specific generic top level domains. This regex filters dummy email addresses like asdf@adsf.adsf. You will need to update it as new top-level domains are added.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

So even when following official standards, there are still trade-offs to be made. Don't blindly copy regular expressions from online libraries or discussion forums. Always test them on your own data and with your own applications.
分享到:
评论

相关推荐

    php-7.4.33-centos7下编译,含libonig.so.5及libicu*.so.50

    gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --...

    php-5.3.2.tar

    ... 一、系统准备 在开始安装之前,确保你的Linux系统已经更新到最新版本,并安装了必要的编译工具和依赖库。通常需要的是GCC编译器、CMake、libpng、libjpeg、libxml2、zlib、..../configure --prefix=/usr/local/...

    boost_regex-vc80-mt-1_34.lib

    自己编译了一个库,供大家分享,下载,使用

    使用正则表达式验证E-mail格式

    正则表达式(Regular Expression)是一种强大的文本处理工具,尤其适用于验证字符串模式。本文将详细介绍如何使用正则表达式来验证E-mail格式,并提供一个可运行的示例。 一、E-mail地址的标准格式 根据RFC 5322...

    boost_regex-vc6-1_37

    4. `libboost_regex-vc6-mt-gd-1_37.lib`和`libboost_regex-vc6-mt-s-1_37.lib`:分别为多线程非调试和单线程非调试的静态链接库。 5. `libboost_regex-vc6-mt-1_37.lib`:多线程非调试版本的静态链接库。 6. `boost...

    java Regular Expression / regexp / zhengzebiaodashi

    正则表达式(Regular Expression,简称regex)是Java编程语言中的一个重要工具,用于处理字符串模式匹配和搜索替换。在Java中,正则表达式通过java.util.regex包中的类和接口来实现,例如Pattern和Matcher。本篇文章...

    php-7.1.29.tar.gz.zip

    --with-pcre-regex \ --with-sqlite3 \ --with-zlib \ --enable-bcmath \ --with-iconv \ --with-bz2 \ --enable-calendar \ --with-curl \ --with-cdb \ --enable-dom \ --enable-exif \ --enable-...

    C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

    在C/C++编程环境中,正则表达式(Regex或Regular Expression)是一种强大的文本处理工具,用于模式匹配、字符串查找、替换等操作。由于C++标准库并没有内置完整的正则表达式支持,直到C++11标准引入了`<regex>`库,...

    用于电子邮件验证的Golang软件包-Golang开发

    格式(简单的正则表达式,请参见:https://www.w3.org/TR/html5/forms.html#valid-e-mail-address和https://davidcel.is/posts/stop-validating-email-addresses -with-regex /)有效的域checkmail Golang软件包,...

    libboost_regex-vc90-mt-s-1_53.lib

    4. **使用libboost_regex-vc90-mt-s-1_53.lib** 使用该库时,需要链接此库文件,并包含对应的头文件。例如,要在项目中使用Boost.Regex,首先添加库文件到链接器设置,然后包含`#include <boost/regex.hpp>`。通过`...

    Regex Expression(正则表达式)

    Regular expression 具有可以表达出难以描述、複杂、但是却有特殊规则的字串的功能,所以许多的 UNIX 工具程式都有支援 Regular expression 的功能。例如 ex 、 vi 、 sed 、 awk 、 grep 、 emacs 等等都有支援。...

    C#使用正则表达式验证E-Mail格式

    正则表达式(Regular Expression)是一种强大的文本处理工具,可以用来匹配字符串中的某些字符组合。它在程序设计语言中被广泛用于搜索、替换或提取特定模式的字符串。在本例中,我们将使用C#内置的`System.Text....

    Linux+Apache+Nginx+Mysql+PHP完美配置教程

    mhash --enable-ftp --with-gd --enable-gd-native-ttf --enable-sockets --enable-sysvmsg --enable-sysvshm --enable-pcntl --with-openssl --with-mcrypt --with-mhash --enable-zip --with-pcre-regex --with-...

    regular expression library正则表达式库

    GNU Regex 程式库是 GNU 发展,提供操作比对 Regular Expression 文字字串的程式库,也就是使用 GNU Regex 程式库,可以作到以下的功能: 比对一字串是否完全与 Regular Expression 相幅合。 在一字串中寻找与 ...

    tiny-regex-c-master_C语言_master表达式_最小正则表达_

    《C语言实现的微型正则表达式库:tiny-regex-c-master》 在软件开发中,正则表达式是处理字符串的强大工具,尤其在文本处理、数据验证和搜索替换等场景下发挥着重要作用。然而,对于资源有限的嵌入式系统而言,标准...

    regex-2.7-lib.zip

    《正则表达式库 regex-2.7-lib.zip 深度解析》 在计算机科学领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配字符串模式,广泛应用于数据验证、搜索与替换等场景。本文将...

    The Regex Coach - interactive regular expressions

    The Regex Coach is a graphical application for Windows which can be used to experiment with (Perl-compatible) regular expressions interactively. It has the following features: It shows whether a ...

    正则表达式资料全集 Regular Expression Syntax Reference

    正则表达式(Regular Expression)是一种强大的文本处理工具,它能用来进行字符串匹配、查找、替换等操作。在编程语言中,正则表达式被广泛应用于数据验证、文本解析、日志分析等领域。本资料全集是针对正则表达式...

    regex-2022.6.2-cp311-cp311-win_amd64.whl.zip

    标题中的"regex-2022.6.2-cp311-cp311-win_amd64.whl.zip"是一个Python软件包的压缩文件,它包含了Python的正则表达式库regex的特定版本。这个版本是2022年6月2日发布的,适用于Python 3.11解释器,并且是为Windows ...

Global site tag (gtag.js) - Google Analytics