表: Users
+---------------+---------+ | Column Name | Type | +---------------+---------+ | user_id | int | | name | varchar | | mail | varchar | +---------------+---------+ user_id 是该表的主键(具有唯一值的列)。 该表包含了网站已注册用户的信息。有一些电子邮件是无效的。
编写一个解决方案,以查找具有有效电子邮件的用户。
一个有效的电子邮件具有前缀名称和域,其中:
- 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线
'_'
,点'.'
和/或破折号'-'
。前缀名称 必须 以字母开头。 - 域 为
'@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 的电子邮件以点开头。
这段代码使用了 SQL 中的 REGEXP
和 REGEXP_MATCHES()
函数来实现复杂的模式匹配,确保邮件地址满足特定格式要求。让我详细解释一下:
# Write your MySQL query statement below
select user_id, name,mail
from users
where mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$'
-
SQL查询语句:
SELECT user_id, name, mail
: 查询语句选择了用户表中的用户ID、姓名和邮箱地址。FROM Users
: 从名为Users
的表中查询数据。WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$'
: 这是一个过滤条件,使用了REGEXP
操作符来匹配符合特定邮件格式的邮箱地址。
-
正则表达式解释:
^
: 表示匹配字符串的开头。[a-zA-Z]
: 第一个字符必须是字母。[a-zA-Z0-9_.-]*
: 后续字符可以是字母、数字、下划线、点或破折号,可以重复零次或多次。\\@leetcode\\.com$
: 以@leetcode.com
结尾的字符串。注意,在 SQL 中使用正则表达式时,通常需要双反斜杠\\
来转义特殊字符。
-
使用的函数方法:
REGEXP
操作符: 用于判断某个字段是否符合指定的正则表达式模式。REGEXP_MATCHES()
函数: 虽然上面的示例中没有直接使用REGEXP_MATCHES()
,但它可以用于从字段中提取符合正则表达式模式的子串,返回一个数组。dad
建议了解一下sql常用的正则表达式!!!