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分别表示以下内容:

  1. \b:单词边界

    • \b 是单词边界的元字符。它匹配一个单词的开始或结束。一个单词被定义为字母数字字符的序列。
    • 例如,\bword\b 可以匹配 "word",但不匹配 "password" 中的 "word"。
  2. \s:空白字符

    • \s 匹配任何空白字符,包括空格、制表符(Tab)、换行符等。
    • 例如,\s+ 可以匹配一个或多个连续的空白字符。

在正则表达式中,这些元字符通常用于定义模式,以便更精确地匹配字符串。在 SQL 的 REGEXP 中,这些元字符可以用于过滤数据,特别是在 WHERE 子句中。

所以我们也可以使用\b:

\b匹配非单词字符(在我们的例子中是空格)或字符串中第一个字符之前的位置。另外,需要用另一个反斜杠转义一个反斜杠,如下所示:\\b否则,正则表达式将不会计算。

PS\b还匹配最后一个字符之后的位置,但在这个问题的上下文中并不重要。

SELECT * FROM patients WHERE conditions REGEXP '\\bDIAB1'

第二种方法:使用LIKE

在 MySQL 中,LIKE 是用于模糊匹配的关键字,通常与通配符结合使用。以下是一些关于 LIKE 的基本用法:

  1. 百分号 % 通配符:

    • % 表示零个或多个字符的通配符。
    • 例如,'a%' 匹配以字母 'a' 开头的任何字符串。
    • '%a' 匹配以字母 'a' 结尾的任何字符串。
    • '%or%' 匹配包含字母序列 'or' 的任何字符串。
  2. LIKE 的使用:

    • 使用 LIKE 操作符时,通常配合 %_ 通配符。
    • 例如,WHERE column_name LIKE 'a%' 将匹配 column_name 列中以字母 'a' 开头的任何值。
  3. 大小写敏感性:

    • 默认情况下,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%';

 

posted @ 2024-01-10 00:36  我是球啊  阅读(1485)  评论(0编辑  收藏  举报