我正在编写一个简单的小应用程序,可以让我分享信息。我有一个关于使用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.使用此在线资源 任何帮助,我会很感激。
答案 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)
答案 3 :(得分:1)
[a-z0-9!#$%&'*+/=?^_`{|}~-]+
(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)
@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+
a-z
,0-9
以点结尾,可选-
在中间以点结尾。这必须至少匹配一次。[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
a-z
或0-9
,可选地后跟a-z
,0-9
,-
,但不能再以-
结尾。< / LI>
醇>
答案 4 :(得分:0)
见answer。这个问题可能难以解决。你有两个问题。 1. RegEx并不容易。逃避特殊字符很乱。最后,电子邮件地址很复杂。如果你真的感兴趣,我可能会建议你学习这篇文章。
答案 5 :(得分:0)
我有两个建议。