第 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 | +------------------+------+ 分析: 利用 ^ 开头 $ 结尾定位