使用正则表达式验证电子邮件地址

时间:2014-03-04 00:37:26

标签: regex validation

我正在编写一个简单的小应用程序,可以让我分享信息。我有一个关于使用regx验证电子邮件地址的问题。 我亲自学习。但是当涉及到现实世界的例子时,可以用正则表达式验证字符串,我就被卡住了。

练习: 解开以下用于验证电子邮件地址的正则表达式:

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

它看起来像个混乱的角色。

有人可以向我解释这是如何工作的?

我尝试按Jan Goyvaerts.使用此在线资源 任何帮助,我会很感激。

6 个答案:

答案 0 :(得分:4)

首先,有一个关于完全相同的事情的好线程: Using a regular expression to validate an email address

然后,下面是正则表达式的解释:

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

- 方括号表示符号类,包含方括号中的所有符号。加号('+')是一个量词,这意味着由此符号类表示的符号序列必须至少有一个字符长。

此外,'+'是 greedy ,因此,模式的这一部分将匹配最大可能长度的符号序列。

谈到方括号内容,'a-z'表示范围内的任何符号,可以在数学上描述为[a,z],并且'0-9'是相似的。在这种情况下,所有其他符号只是符号。

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

- 在正则表达式中,括号表示分组,星号('*')是贪心量词,表示“出现零次或多次”。所以我们不确定是否要找到括号内容,但我们不排除这种可能性。

然后,在括号内,我们看到?:字符组合,放在括号内告诉我们内部的符号组不应该被捕获为子字符串以供进一步参考。

更进一步,\。意味着只是一个普通的点(见Escape sequence),因为点符号是Regex中的元符号。

在点之后,我们再次看到符号的字符,如上所述。

@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+

- 这里我们看到at符号('@'),这里只是一个符号,然后有一个非捕获符号组,它会出现一次或多次(因为+之后),以及包括[a-z0-9]类的单个符号和另一个非捕获符号组,除了问号符号('?')之外,您可以使用我上面的解释完全描述的内容,这意味着“一次或者完全没有“在这种情况下(即如果它被用作量词)。

[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

- 最后一部分与上面解释的符号组相似,所以我相信你现在有足够的信息来理解它。

有关量词类型的更多信息,请访问:Greedy vs. Reluctant vs. Possessive Quantifiers

一个很好的正则表达式参考:Regular Expression Language - Quick Reference

有关使用正则表达式捕获的一些信息:Regex Tutorial - Parentheses for Grouping and Capturing

关于特殊字符:Regex Tutorial - Literal Characters and Special Characters

答案 1 :(得分:3)

正则表达式语句可能很有趣但很难理解。本声明分为5部分。

用户名的一个有效字符

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

检查一个'。'以及任何额外数量的字符

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

'@'符号

有效的第二级/下级域

(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+

有效的顶级域名

[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

我建议http://www.ultrapico.com/expresso.htm。它将打破你的声明。

答案 2 :(得分:2)

我找到了一个非常出色的工具来显示正则表达式:http://regexper.com

它告诉我你的正则表达式像这样崩溃了。希望这有助于解释它。

enter image description here

答案 3 :(得分:1)

  1. [a-z0-9!#$%&'*+/=?^_`{|}~-]+
    这将查找此处给出的至少一个字符(a-z,0-9和那些特殊字符)。
  2. (?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)
    这看起来与上面相同,但只有当它站在一个点之后。这部分是可选的,可以无限期重复。它可以防止名称末尾的点。
  3. @
    匹配@符号
  4. (?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+
    这匹配a-z0-9以点结尾,可选-在中间以点结尾。这必须至少匹配一次。
  5. [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    这会查找a-z0-9,可选地后跟a-z0-9-,但不能再以-结尾。< / LI>

答案 4 :(得分:0)

answer。这个问题可能难以解决。你有两个问题。 1. RegEx并不容易。逃避特殊字符很乱。最后,电子邮件地址很复杂。如果你真的感兴趣,我可能会建议你学习这篇文章。

答案 5 :(得分:0)

我有两个建议。

  1. 转义特殊字符很麻烦。 2.电子邮件地址很复杂。如果你真的感兴趣,我可能会建议你学习这篇文章。请查看其他帖子:Validation in RegexRegex Help