第 9 章 用正则表达式进行搜索
9.1 正则表达式介绍
正则表达式是用来匹配文本的特殊的串(字符集合)
9.2 使用 MySQL 正则表达式
MySQL 用WHERE 子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤 SELECT 检索出的数据
9.2.1 基本字符匹配
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name LIKE 'MBR';
输出:
+------------------+------+
| help_category_id | name |
+------------------+------+
| 8 | MBR |
+------------------+------+
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name REGEXP 'MBR';
输出:
+------------------+---------------+
| help_category_id | name |
+------------------+---------------+
| 8 | MBR |
| 32 | MBR Functions |
+------------------+---------------+
分析:
LIKE:
1. 适用于简单的模糊匹配,但功能相对较弱
2. 在某些情况下,对于简单模式可能比较高效
3. 使用通配符 % 和 _
REGEXP:
1. 支持更强大的正则表达式,可以实现更复杂的匹配规则
2. 对于复杂的正则表达式,可能会比 LIKE 更消耗计算资源
3. 使用正则表达式语法
输入: SELECT server_cost.cost_name,server_cost.last_update FROM server_cost WHERE server_cost.cost_name REGEXP '.row';
输出:
+---------------------------+---------------------+
| cost_name | last_update |
+---------------------------+---------------------+
| disk_temptable_row_cost | 2024-01-03 15:22:15 |
| memory_temptable_row_cost | 2024-01-03 15:22:15 |
+---------------------------+---------------------+
分析: 这里使用了正则表达式 .row,'.' 是正则表达式中的一个特殊字符,它表示匹配任意字符
9.2.2 进行 OR 匹配
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name REGEXP 'MBR|XML';
输出:
+------------------+---------------+
| help_category_id | name |
+------------------+---------------+
| 8 | MBR |
| 32 | MBR Functions |
| 17 | XML |
+------------------+---------------+
分析: 语句中使用了正则表达式 MBR|XML,表示匹配其中之一,因此都匹配返回。以下是 LIKE 的对比
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name LIKE 'MBR' OR help_category.name LIKE 'XML';
输出:
+------------------+------+
| help_category_id | name |
+------------------+------+
| 8 | MBR |
| 17 | XML |
+------------------+------+
9.2.3 匹配几个字符之一
输入: SELECT server_cost.cost_name,server_cost.last_update FROM server_cost WHERE server_cost.cost_name REGEXP 'e[vmp]'
输出:
+------------------------------+---------------------+
| cost_name | last_update |
+------------------------------+---------------------+
| disk_temptable_create_cost | 2024-01-03 15:22:15 |
| disk_temptable_row_cost | 2024-01-03 15:22:15 |
| memory_temptable_create_cost | 2024-01-03 15:22:15 |
| memory_temptable_row_cost | 2024-01-03 15:22:15 |
| row_evaluate_cost | 2024-01-03 15:22:15 |
+------------------------------+---------------------+
分析: 这里使用了正则表达式 'e[vmp]',[vm] 定义一组字符,它的意思是匹配 v 或 m 或 p,因此返回 ev 和 em(没有匹配到 ep)
9.2.4 匹配范围
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category_id REGEXP '[1-2]' ORDER BY help_category_id;
输出:
+------------------+-------------------------------+
| help_category_id | name |
+------------------+-------------------------------+
| 1 | Help Metadata |
| 2 | Data Types |
| 10 | Comparison Operators |
| 11 | Logical Operators |
| 12 | Flow Control Functions |
| 13 | Numeric Functions |
| 14 | Date and Time Functions |
| 15 | String Functions |
| 16 | Cast Functions and Operators |
| 17 | XML |
| 18 | Bit Functions |
| 19 | Encryption Functions |
| 20 | Locking Functions |
| 21 | Information Functions |
| 22 | Spatial Functions |
| 23 | WKT Functions |
| 24 | WKB Functions |
| 25 | Geometry Constructors |
| 26 | Geometry Property Functions |
| 27 | Point Property Functions |
| 28 | LineString Property Functions |
| 29 | Polygon Property Functions |
| 31 | Geometry Relation Functions |
| 32 | MBR Functions |
| 41 | Data Manipulation |
| 42 | Transactions |
| 51 | Utility |
| 52 | Storage Engines |
+------------------+-------------------------------+
分析: 这里使用正则表达式 [1-2],定义了一个范围
9.2.5 匹配特殊字符
输入: SELECT database_name,table_name,stat_name FROM innodb_index_stats WHERE stat_name REGEXP '.';
输出:
+---------------+------------+--------------+
| database_name | table_name | stat_name |
+---------------+------------+--------------+
| mysql | component | n_diff_pfx01 |
| mysql | component | n_leaf_pages |
| mysql | component | size |
| sys | sys_config | n_diff_pfx01 |
| sys | sys_config | n_leaf_pages |
| sys | sys_config | size |
+---------------+------------+--------------+
分析: 因为 . 匹配任意字符,所有每个行逗号被检索出来
输入: SELECT database_name,table_name,stat_name FROM innodb_index_stats WHERE stat_name REGEXP '\\.';
输出: Empty set (0.01 sec)
分析: 为了匹配特殊字符必须使用 \\ 为前导
元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表
9.2.6 匹配字符类
类 说明
[:alnum:] 任意字母和数字
[:alpha:] 任意字符
[:blank:] 空格和制表
[:cntrl:] ASCII 控制字符
[:digit:] 任意数字
[:graph:] 与 [:print:] 相同,但不包括空格
[:lower:] 任意小写字母
[:print:] 任意可打印字符
[:punct:] 既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符
[:space:] 包括空格在内的任意空白字符
[:upper:] 任意大写字母
[:xdigit:] 任意十六进制数字
输入: SELECT database_name,table_name,stat_name FROM innodb_index_stats WHERE stat_name REGEXP '[:alnum:]';
输出:
+---------------+------------+--------------+
| database_name | table_name | stat_name |
+---------------+------------+--------------+
| mysql | component | n_diff_pfx01 |
| mysql | component | n_leaf_pages |
| mysql | component | size |
| sys | sys_config | n_diff_pfx01 |
| sys | sys_config | n_leaf_pages |
| sys | sys_config | size |
+---------------+------------+--------------+
9.2.7 匹配多个实例
元字符 说明
* 0 个或多个匹配
+ 1 个或多个匹配
? 0 个或 1 个匹配
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围( m 不超过 255 )
输入: SELECT help_topic_id FROM help_relation WHERE help_topic_id REGEXP '[[:digit:]]{4}' ORDER BY help_topic_id;
输出: Empty set (0.01 sec)
分析: [:digit:] 匹配任意数字,{4} 确切要求它前面的字符出现 4 次,所以连在一起的任意 4 位数字
输入: SELECT help_topic_id,help_topic.name FROM help_topic WHERE help_topic.name REGEXP 'HELP\\_?' ORDER BY help_topic_id;
输出:
+---------------+----------------+
| help_topic_id | name |
+---------------+----------------+
| 0 | HELP_DATE |
| 1 | HELP_VERSION |
| 3 | HELP COMMAND |
| 697 | HELP STATEMENT |
+---------------+----------------+
分析: \\ 转义字符 _ , ? 指示前面字符可出现 0 次 或者 1 次
9.2.8 定位符
元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name REGEXP 'MBR';
输出:
+------------------+---------------+
| help_category_id | name |
+------------------+---------------+
| 8 | MBR |
| 32 | MBR Functions |
+------------------+---------------+
输入: SELECT help_category_id,help_category.name FROM help_category WHERE help_category.name REGEXP '^MBR$';
输出:
+------------------+------+
| help_category_id | name |
+------------------+------+
| 8 | MBR |
+------------------+------+
分析: 利用 ^ 开头 $ 结尾定位