查找拥有有效邮箱的用户(sql练习)

表: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+
user_id 是该表的主键(具有唯一值的列)。
该表包含了网站已注册用户的信息。有一些电子邮件是无效的。

编写一个解决方案,以查找具有有效电子邮件的用户。

一个有效的电子邮件具有前缀名称和域,其中:

  1.  前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。前缀名称 必须 以字母开头。
  2.  为 '@leetcode.com' 。

以任何顺序返回结果表。

结果的格式如以下示例所示:

示例 1:

输入:
Users 表:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+
输出:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+
解释:
用户 2 的电子邮件没有域。 
用户 5 的电子邮件带有不允许的 '#' 符号。
用户 6 的电子邮件没有 leetcode 域。 
用户 7 的电子邮件以点开头。

本题考查正则表达式的应用。

常用的正则表达式字符和特殊字符有:

①普通字符:表示匹配该字符本身,如a表示匹配字母"a"。

②元字符:具有特殊含义的字符,如 . 表示匹配除换行符以外的任意字符。

③字符类:用[ ]表示,表示匹配括号内的任意一个字符,如[abc]表示匹配字符"a"、“b"或"c”。

④反义字符类:用[^]表示,表示匹配除括号内字符以外的任意字符,如[^abc]表示匹配除"a"、“b”、"c"以外的任意字符。

⑤重复字符:用*、+、?表示,分别表示匹配前一个字符0次或多次、1次或多次、0次或1次。

⑥边界匹配:用^、$表示,分别表示匹配字符串的开头和结尾。

⑦分组:用()表示,可以将多个字符组合为一个整体,如(ab)+表示匹配"ab"、“abab”等。

⑧转义字符:用\表示,可以将特殊字符转义为普通字符,如\.表示匹配字符"."。


正则表达式的用法有:

匹配:使用match()函数在字符串中查找匹配正则表达式的部分,并返回一个包含匹配结果的数组。

查找:使用search()函数在字符串中查找匹配正则表达式的部分,并返回第一个匹配的位置。

替换:使用replace()函数将字符串中匹配正则表达式的部分替换为指定的内容。

分割:使用split()函数根据正则表达式将字符串分割为多个部分,并返回一个数组。

其他用法:

量词:用来指定前面的字符或字符类的重复次数。

常用的量词有:

*:匹配前一个字符0次或多次。

+:匹配前一个字符1次或多次。

?:匹配前一个字符0次或1次。

{n}:匹配前一个字符恰好n次。

{n,}:匹配前一个字符至少n次。

{n,m}:匹配前一个字符至少n次,最多m次。

特殊字符:

.:匹配除换行符以外的任意字符。

\d:匹配数字字符。

\D:匹配非数字字符。

\w:匹配字母、数字、下划线字符。

\W:匹配非字母、数字、下划线字符。

\s:匹配空白字符(空格、制表符、换行符等)。

\S:匹配非空白字符。

\b:匹配单词边界。

\B:匹配非单词边界。

分组和引用:

():将多个字符组合为一个整体。

(?:):非捕获分组,用于只匹配但不捕获。

\1、\2、…:引用前面的分组,用于匹配相同的内容。

断言:

(?=...):正向肯定前瞻,用于匹配满足某个条件的位置。

(?!...):正向否定前瞻,用于匹配不满足某个条件的位置。

(?<=...):反向肯定后顾,用于匹配位于某个条件之后的位置。

(?<!...):反向否定后顾,用于匹配不位于某个条件之后的位置。

select
    *
from
    users
where
    mail REGEXP "^([a-z|A-Z])[a-z|A-Z|0-9|_|\.|\/|\-]*(@leetcode[\.]com)$"

  • 40
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值