自学内容网 自学内容网

[每日一练]MySQL的模糊匹配和正则表达式来查找开头的特殊字符

#改题目来源于力扣:

1527. 患某种疾病的患者 - 力扣(LeetCode)

题目要求:

患者信息表: Patients

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
 

查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。

按 任意顺序 返回结果表。

示例 1:

输入:
Patients表:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
输出:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。

思路流程:

1.由此可见,我们需要返回字符串是以前缀“DIAB1”的所有患者,这时候可以利用正则表达式进行匹配:

\\bDIAB1

其中\b表达匹配单词边界,放在字符串前可以匹配以这个字符串开头的字符串,放在字符串后可以匹配以这个字符串结尾的字符串,放在两边表示只匹配这个字符串。\\b表示对\b进行转义。

2.当然,我们可以利用MySQL的模糊匹配进行查找。%作为通配符,和正则表达式里的\b有区别:

  • %字符串:匹配以“字符串”结尾的记录。
  • 字符串%:匹配以“字符串”开头的记录。
  • %字符串%:匹配包含“字符串”的记录。

在这里,我们可以发现以DIAB1开头的情况有两种,一种是DIAB1位于字符串首位,一种是DIAB1位于总字符串中间,被空格隔开了,所以它的开头有一个空格,利用模糊匹配要考虑到所有情况,比正则表达式难一些。

"DIAB1%" OR "% DIAB1%"
#以“DIAB1”开头的字符串以及包含“ DIAB1”的字符串

代码实现:

# Write your MySQL query statement below
SELECT * 
FROM Patients
WHERE conditions REGEXP '\\bDIAB1'

 或者:

SELECT *
FROM Patients
WHERE conditions LIKE "DIAB1%" OR conditions LIKE "% DIAB1%"

题后思考:

既然要表达开头,为什么不可以用'^DIAB1'而是用''\\bDIAB1'?

因为“^”符号表达的开头匹配,必须且只能在最前面才可以,而题目中所谓的“开头”DIAB1,有时候会在第二个字符串里,不再最前方第一个字符串的开头,造成BUG.

而\b表达的是字符串的边界,即如果把\b放在DIAB1之前,不管DIAB1在第几个字符串,只要是以它开头就都会匹配到。


原文地址:https://blog.csdn.net/2302_77975940/article/details/142359671

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!