SQL正则表达式
使用正则表达式
一般来说,如果被要求匹配一个字符串,应该首先会想到一个正则表达式模式进行匹配。
正则表达式提供各种功能:
1. ^:表示一个字符串或者行的开头
2. [a-z]:表示一个字符的范围,匹配从a到z的任何字符
3. [0-9]:表示一个字符范围,匹配从0到9的任何字符
4. [a-zA-Z]:匹配从a到z或者A到Z的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。
5. [^a-z]:这个变量匹配不在a到z范围内的任何字符。字符^用来否定字符范围,在方括号内的含义与在方括号之外表示开始的含义不同。
6. [a-z*]:表示一个字符范围,匹配从a到z的任何字符0次或多次。
7. [a-z]+:表示一个字符范围,匹配从a到z的任何字符1次或者多次。
8. .:匹配任意一个字符
9. \.:表示句点字符。反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,我们需要转义反斜杠本身,因此需要使用\\.。
10. $:表示一个字符串或者行的结尾。
来看一道例题:
1517. 查找拥有有效邮箱的用户
1. 前缀名以字母开头:^[a-zA-Z]
2. 前缀名包含字母(大小写)、数字、下划线、句点、横杠:[a-zA-Z0-9\_\.\-]
3. 以域名'@leetcode.com'结尾:@leetcode\\.com$
SELECT user_id, name, mail FROM Users -- 请注意,我们还转义了`@`字符,因为它在某些正则表达式中具有特殊意义 WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';
第二个例题:1527. Patients With a Condition
需要注意的是DIAB可能在第二个单词中,因此可以分为以下两种情况:
1. 条件代码以"DIAB1"开头
2. 条件代码包含" DIAB1" ,即有一个空格在前
第一种方法是使用REGEXP
1. 位于第一个时:REGEXP '^DIAB1',用^匹配开始
2. 不位于第一个时:REGEXP '\sDIAB1',用\s匹配一个被视为白空格的空格或字符
需要注意的是,多数正则表达式实现使用单个反斜杠转义特殊字符,一遍能使用这些字符本身,MySQL要用两个反斜杠转义特殊字符,MySQL自己解释一个,正则表达式库解释另一个,所以在MySQL中用\\s。| 管道符号用于指定匹配字符串时要使用的替代模式;在由竖线分隔的一行模式中,竖线被解释为OR,匹配过程从最左侧的模式开始,在找到第一个匹配项时停止。
SELECT * FROM patients WHERE conditions REGEXP '^DIAB1|\\sDIAB1';
在 SQL 中,正则表达式(regexp)的\b
和\s
分别表示以下内容:
-
\b
:单词边界\b
是单词边界的元字符。它匹配一个单词的开始或结束。一个单词被定义为字母数字字符的序列。- 例如,
\bword\b
可以匹配 "word",但不匹配 "password" 中的 "word"。
-
\s
:空白字符\s
匹配任何空白字符,包括空格、制表符(Tab)、换行符等。- 例如,
\s+
可以匹配一个或多个连续的空白字符。
在正则表达式中,这些元字符通常用于定义模式,以便更精确地匹配字符串。在 SQL 的 REGEXP
中,这些元字符可以用于过滤数据,特别是在 WHERE
子句中。
所以我们也可以使用\b:
\b
匹配非单词字符(在我们的例子中是空格)或字符串中第一个字符之前的位置。另外,需要用另一个反斜杠转义一个反斜杠,如下所示:\\b
。否则,正则表达式将不会计算。
PS\b
还匹配最后一个字符之后的位置,但在这个问题的上下文中并不重要。
SELECT * FROM patients WHERE conditions REGEXP '\\bDIAB1'
第二种方法:使用LIKE
在 MySQL 中,LIKE
是用于模糊匹配的关键字,通常与通配符结合使用。以下是一些关于 LIKE
的基本用法:
-
百分号
%
通配符:%
表示零个或多个字符的通配符。- 例如,
'a%'
匹配以字母 'a' 开头的任何字符串。 '%a'
匹配以字母 'a' 结尾的任何字符串。'%or%'
匹配包含字母序列 'or' 的任何字符串。
-
LIKE
的使用:- 使用
LIKE
操作符时,通常配合%
或_
通配符。 - 例如,
WHERE column_name LIKE 'a%'
将匹配column_name
列中以字母 'a' 开头的任何值。
- 使用
-
大小写敏感性:
- 默认情况下,
LIKE
是大小写敏感的。如果希望进行大小写不敏感的匹配,可以使用COLLATE
子句,如WHERE column_name COLLATE utf8_general_ci LIKE 'pattern'
。
- 默认情况下,
SELECT patient_id, patient_name, conditions FROM Patients WHERE conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%';