正则表达式是用某种模式去匹配一类字符串的一个方式。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。
创建数据表tb_book(图书信息表),并添加相关数据,用于后续的示例使用。
-- 创建图书信息表
CREATE TABLE IF NOT EXISTS tb_book
(
id INT AUTO_INCREMENT PRIMARY KEY,
books VARCHAR(50) NOT NULL
) COMMENT = '图书信息表';
-- 插入图书信息数据
INSERT INTO tb_book(books) VALUES('pan_junbiao的博客'),('Java程序设计'),('深入Java编程')
,('Java Web从入门到精通'),('深入Java Web编程'),('深入理解Java虚拟机'),('Java并发编程')
,('MySQL数据库'),('深入SQL Server数据库'),('Oracle数据库'),('Oracle从入门到精通')
,('C#高级编程'),('PHP高级编程'),('Java多线程技术'),('pan_junbiao的CSDN博客');
-- 查询图书信息表数据
SELECT * FROM tb_book;
执行结果:
在MySQL中,使用REGEXP关键字来匹配查询正则表达式。其基本形式如下:
字段名 REGEXP '匹配方式'
(1)字段名:表示需要查询的字段名称。
(2)匹配方式:表示一哪种方式来进行匹配查询。
正则表达式的模式字符:
模式字符 | 含义 | 应用举例 |
^ | 匹配以特定字符或字符串开头的记录 | 使用“^”表达式查询已字母“Java”开头的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP '^Java'; |
$ | 匹配以特定字符或字符串结尾的记录 | 使用“$”表达式查询已“数据库”结尾的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP '数据库$'; |
. | 匹配字符串的任意一个字符,包括回车和换行符 | 使用“.”表达式查询包括“J”字符的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP 'J.'; |
[字符集合] | 匹配字符集合中的任意一个字符 | 使用“[]”表达式查询包含“MCQ”字符的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP '[MCQ]'; |
[^字符集合] | 匹配排除“字符集合”以外的任意一个字符串 | 查询排除包括c-z字母以外的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP '[^c-z]'; |
S1|S2|S3 | 匹配S1、S2和S3中的任意一个字符串 | 查询包含“Java”、“C#”、“Oracle”字符中任意一个字符的记录,语句如下:SELECT * FROM tb_book WHERE books REGEXP 'JAVA|C#|ORACLE'; |
* | 匹配多个该符号之前的字符,包括0和1个 | 使用“*”表达式查询“A”字符前面可能出现过J字符的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP 'J*A'; |
+ | 匹配多个该符号之前的字符,至少包括1个 | 使用“+”表达式查询“A”字符前面至少出现过一个“J”字符的记录,语句如下:SELECT * FROM tb_book WHERE books REGEXP 'J+A'; |
字符串{N} | 匹配字符串出现N次 | 使用“{N}”表达式查询连续出现3次“a”字符的记录,语句如下: SELECT * FROM tb_book WHERE books REGEXP 'a{3}'; |
字符串{M,N} | 匹配字符串出现至少M次,最多N次 | 使用“{M,N}”表达式查询至少出现2次,最多出现4次“a”字符的记录,语句如下:SELECT * FROM tb_book WHERE books REGEXP 'a{2,4}'; |
注意:关于大小写的区分,MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写。如果要区分大小写,应该使用BINARY关键字。
例如:使用“.”表达式查询包括大写“L”字符的记录,语句如下:
SELECT * FROM tb_book WHERE books REGEXP BINARY 'L.';
1、匹配指定字符中的任意一个
使用方括号([])可以将需要查询字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。
示例:查询名称中包括a、b、c字母中任意一个的记录。
SELECT * FROM tb_book WHERE books REGEXP '[abc]';
执行结果:
2、使用“*”和“+”来匹配多个字符
正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而“*”可以表示0个字符。
示例:使用“*”表达式查询“A”字符前面可能出现过J字符的记录。
SELECT * FROM tb_book WHERE books REGEXP 'J*A';
执行结果:
结果说明:查询结果显示,“Oracle”记录中字母A之前并没有字母J。因为“*”可以表示0个,所以字母A前面有0个或者多个字母J出现。
示例:使用“+”表达式查询“A”字符前面至少出现过一个“J”字符的记录。
SELECT * FROM tb_book WHERE books REGEXP 'J+A';
执行结果:
3、匹配以指定的字符开头和结束的记录
正则表达式中,^表示字符串的开始位置,$表示字符串的结束位置。
示例:查询以“pan”开头,以“博客”结尾的记录。
SELECT * FROM tb_book WHERE books REGEXP '^pan.+博客$';
执行结果: