regex for email validation
我已经编写了下面的regex来进行一个非常简单的电子邮件验证。我计划发送一个确认链接。
1 | /.*@[a-z0-9.-]*/i |
但是,我希望从当前状态增强它,因为这样的字符串不会产生所需的结果:
test,[email protected],测试
"测试"部分不希望包含在比赛中。我尝试过单词边界,但没有成功。
谢谢!
这要复杂得多!!!!请参阅mail::rfc822::address,然后害怕……非常害怕。
不使用正则表达式验证电子邮件地址
相反,来自mail.python.org/pipermail/python-list1,由本·芬尼编写。
The best advice I've seen when people ask"How do I validate whether
an email address is valid?" was"Try sending mail to it".It's both Pythonic, and truly the best way. If you actually want to
confirm, don't try to validate it statically; use the email address,
and check the result. Send an email to that address, and don't use it
any further unless you get a reply saying"yes, this is the right
address to use" from the recipient.The sending system's mail transport agent, not regular expressions,
determines which part is the domain to send the mail to.The domain name system, not regular expressions, determines what
domains are valid, and what host should receive mail for that domain.Most especially, the receiving mail system, not regular expressions,
determines what local-parts are valid.
1这是它死前的原始链接
你所使用的几乎没有任何短到有意义的东西能真正验证电子邮件地址。说到这里,我通常使用的是:
1 | ^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
它实际上是用于ASP.NET的电子邮件地址正则表达式验证器的内置regex。
注意:这个线程中给出的许多regex可能在90年代起作用,但在当今的Web环境中,TLD允许少于2个字符,多于4个字符。例如,[email protected]是一个有效的电子邮件地址,因为.museum是那些新的、长的TLD之一。
我发现,不将整个电子邮件地址与正则表达式匹配,而是更实际地将字符串拆分为@和:
- 首先通过DNS库检查现有MX或域部分的记录。
- 然后对照一个更简单的regex检查本地部分(@左侧的部分)。
进行DNS检查的原因是,尽管符合RFC,但无法访问的电子邮件地址毫无价值。另外检查A记录的原因是,当找不到MX记录时,它们用于确定将邮件传递到何处。(见RFC2821,3.6)
进一步提示:
- 使用一个强大的DNS解析程序库,不要卷自己的。对大公司进行测试。这些服务器有时有大量的邮件服务器,这会导致问题。我在BMW.com上看到了一辆小车图书馆。只是说。:)
而不是。尝试匹配除s(空白)以外的每个字符:
1 | /[^\s]*@[a-z0-9.-]*/i |
这是来自Regex Buddy(绝对需要购买Prog!)
1 | \b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b |
较小的两步regex提供了良好的结果
/**检查电子邮件地址的格式是否有效。*邮箱的前导字符必须是alpha*剩余字符字母数字加u和点*域基必须至少为2个字符*域扩展名必须至少为2,不超过4个字母*允许子域。*@版本050208添加了撇号作为有效字符*@版本04/25/07单封电子邮件地址和单封*允许使用字母域名。*/公共静态布尔ISvalidEmailAddress(字符串地址){字符串SReXEP;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 050208 using the literal that was actually in place // 050719 tweaked // 050907 tweaked, for spaces next to @ sign, two letter email left of @ ok // 042507 changed to allow single letter email addresses and single letter domain names // 080612 added trap and unit test for two adjacent @signs sRegExp = "[a-z0-9#$%&]" // don't lead with dot + "[a-z0-9#$%&'\\.\\-_]*" // more stuff dots OK + "@[^\\.\\s@]" // no dots or space or another @ sign next to @ sign + "[a-z0-9_\\.\\-_]*" // may or may not have more character + "\\.[a-z]{2,4}"; // ending with top level domain: com,. biz, .de, etc. boolean bTestOne = java.util.regex.Pattern.compile( sRegExp, java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).matches(); // should this work ? boolean bTwoDots = java.util.regex.Pattern.compile("\\.\\.", // no adjacent dots java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); boolean bDotBefore = java.util.regex.Pattern.compile("[\\.\\s]@", //no dots or spaces before @ java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); return bTestOne && !bTwoDots && !bDotBefore; } // end IsValidEmail |