数据库学习--使用正则表达式搜索

本文详细介绍了MySQL正则表达式的使用方法,包括匹配文本的特殊串、使用LIKE与REGEXP的区别、大小写敏感性调整、OR匹配、字符匹配、范围匹配、特殊字符处理、字符类使用、重复匹配、定位符应用以及正则表达式的测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正则表达式介绍

正则表达式是用来匹配文本的特殊的串(字符集合)。

二、使用MySQL正则表达式

1、MySQL仅仅支持多数正则表达式实现的一个很小的子集。

2、LIKE匹配整个列值;而REGEXP匹配列值的子串,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。看下面的例子:

  1. mysql>select username from v9_admin where username like 'space';  
  2. Emptyset (0.00 sec)  
  3.    
  4. mysql>select username from v9_admin where username REGEXP 'space';  
  5. +-----------+  
  6. |username  |  
  7. +-----------+  
  8. |warmspace |  
  9. +-----------+  
  10. 1 rowin set (0.02 sec)  

3、默认MySQL中的正则表达式匹配不区分大小写,可使用BINARY关键字区分大小写,如

  1. mysql>select username from v9_admin  
  2.     -> where username REGEXP BINARY'SPACCE';  
  3. Emptyset (0.04 sec)  

4、进行OR匹配:为搜索两个串之一,使用|,如下所示:

  1. mysql>select roleid from v9_admin_role  
  2.     -> where roleid REGEXP '1|3';  
  3. +--------+  
  4. |roleid |  
  5. +--------+  
  6. |      1 |  
  7. |      3 |  
  8. +--------+  
  9. 2 rowsin set (0.00 sec)  

5、匹配几个字符之一:匹配任何单一字符。如下所示:

  1. mysql>select name from v9_collection_node  
  2.     -> where name REGEXP '005-[123]';  
  3. +-----------------+  
  4. |name            |  
  5. +-----------------+  
  6. |101-02-01-005-2 |  
  7. |101-02-01-005-1 |  
  8. |101-02-01-005-3 |  
  9. +-----------------+  
  10. 3 rowsin set (0.00 sec)  

正如所见,[]是另一种形式的OR语句。'005-[123]'与’005-[1|2|3]’是等价的。

匹配除给定字符外的字符:

  1. mysql>select name from v9_collection_node  
  2.     -> where name REGEXP '005-[^123]';  
  3. +-------------------+  
  4. |name              |  
  5. +-------------------+  
  6. |101-02-01-005-4.2 |  
  7. |101-02-01-005-4   |  
  8. |101-02-01-005-5   |  
  9. +-------------------+  
  10. 3 rowsin set (0.00 sec)  

6、可使用-来定义一个范围。如[1-9],[a-b]。

  1. mysql>select name from v9_collection_node  
  2.     -> where name REGEXP '005-[1-3]';  
  3. +-----------------+  
  4. |name            |  
  5. +-----------------+  
  6. |101-02-01-005-2 |  
  7. |101-02-01-005-1 |  
  8. |101-02-01-005-3 |  
  9. +-----------------+  
  10. 3 rowsin set (0.00 sec)  

7、为了匹配特殊字符,必须用\\为前导,例如\\-,\\.等。这种处理即转义(escaping)。

多数正则表达式实现使用单个反斜杠转义特殊字符,但MYSQL要求两个(MYSQL自己解释一个,正则表达式库解释另一个)。

\\也用来引用元字符(具有特殊含义的字符),如下表:



8、为了更方便工作,可以使用预定义的字符集,称为字符类(character class)。

  1. mysql> select name fromv9_collection_node  
  2.    -> where name REGEXP '[[:digit:]]';  
  3. +-------------------+  
  4. name              |  
  5. +-------------------+  
  6. | 101-10-01-002-1   |  
  7. | 101-02-01-005-4.2 |  
  8. | 101-02-01-005-2   |  
  9. | 101-02-01-005-1   |  
  10. | 101-02-01-005-3   |  
  11. | 101-02-01-005-4   |  
  12. | 101-02-01-005-5   |  
  13. | 101-10-01-002-2   |  
  14. | 101-11-04-001-1   |  
  15. +-------------------+  
  16. 9 rowsin set (0.00 sec)  


9、使用正则表达式重复元字符匹配多个实例:

  1. mysql> select name fromv9_collection_node  
  2.    -> where name REGEXP '1{2}';  
  3. +-----------------+  
  4. name            |  
  5. +-----------------+  
  6. | 101-11-04-001-1 |  
  7. +-----------------+  
  8. 1 rowin set (0.00 sec)  


10、定位符(为了匹配特定位置的文本):

  1. mysql> select name from v9_collection_node  
  2.     -> where name REGEXP '2$';  
  3. +-------------------+  
  4. name              |  
  5. +-------------------+  
  6. | 101-02-01-005-4.2 |  
  7. | 101-02-01-005-2   |  
  8. | 101-10-01-002-2   |  
  9. +-------------------+  
  10. rows in set (0.00 sec)  


11、使REGEXP起类似LIKE的作用,它们的区别在于LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式。

12、简单的正则表达式测试:可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0或1(匹配)。

  1. mysql> select 'hello' REGEXP'[0-9]';  
  2. +------------------------+  
  3. 'hello' REGEXP '[0-9]' |  
  4. +------------------------+  
  5. |                      0 |  
  6. +------------------------+  
  7. 1 row in set (0.00 sec) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值