在处理 HTML 表单时,通常会用正则表达式对输入内容进行验证。尤其是邮箱地址,由于其规范非常复杂,要完全正确地匹配邮箱是很困难的,因此我建议在实际项目中尽量使用语言或框架自带的验证方法,而不要完全依赖自己手写的正则表达式。不过,利用我们目前学到的内容,还是可以构建出一个能匹配大部分常见邮箱格式的相对健壮的表达式。
有一点需要注意的是,很多人会使用加号地址(plus addressing)来进行一次性用途,例如:name+filter@gmail.com,它会被送到 name@gmail.com,但通过加号后面的信息实现分类过滤。此外,一些邮箱的域名部分可能包含多个组成部分,例如你可以注册一个域名为 hellokitty.hk.com,从而拥有邮箱地址 ilove@hellokitty.hk.com,因此在匹配邮箱地址中的域名部分时要格外小心。
下面列出了一些常见的邮箱地址。请尝试编写正则表达式,从中提取邮箱的用户名部分,排除加号(+)及其后内容,以及 @ 符号及其后的域名部分。
| Task | Text | Capture Groups | |
| 捕获 | tom@hogwarts.com | tom | ![]() |
| 捕获 | tom.riddle@hogwarts.com | tom.riddle | ![]() |
| 捕获 | tom.riddle+regexone@hogwarts.com | tom.riddle | ![]() |
| 捕获 | tom@hogwarts.eu.com | tom | ![]() |
| 捕获 | potter@hogwarts.com | potter | ![]() |
| 捕获 | harry@hogwarts.com | harry | ![]() |
| 捕获 | hermione+regexone@hogwarts.com | hermione | ![]() |
| 提示 | 要提取每个邮箱地址的开头部分,我们可以使用一个简单的正则表达式:^([\w\.]*)。它可以匹配以字母、数字或点号开头的邮箱地址,并会一直匹配到遇到 @ 或 + 为止的位置。 |