文章目录
- Mysql正则表达式查询
- 1.语法
- 2.例子
- 2.1 查询 name 字段以j开头的记录
- 2.2 查询 name 字段以“y”结尾的记录
- 2.3 查询 name 字段值包含“a”和“y”,且两个字母之间只有一个字母的记录
- 2.4 查询 name 字段值包含字母“T”,且“T”后面出现字母“h”的记录
- 2.5 查询 name 字段值包含字母“T”,且“T”后面至少出现“h”一次的记录
- 2.6 查询 name 字段值包含字母“S”,且“S”后面出现“a”一次或零次的记录
- 2.7 查询 name 字段值包含字符串“an”的记录
- 2.8 查询 name 字段值包含字符串“an”或“en”的记录
- 2.9 查询 name 字段值包含字母“i”或“o”的记录
- 2.10 查询 name 字段值包含字母 a~t 以外的字符的记录
- 2.11 查询 name 字段值出现字母‘e’ 至少 2 次的记录
- 2.12 查询 name 字段值出现字符串“i” 最少 1 次,最多 3 次的记录
Mysql正则表达式查询
1.语法
属性名 REGEXP '匹配方式'
其中,“属性名”表示需要查询的字段名称;“匹配方式”表示以哪种方式来匹配查询。“匹配方式”中有很多的模式匹配字符,它们分别表示不同的意思。下表列出了 REGEXP 操作符中常用的匹配方式。
选项 | 说明 | 例子 | 匹配值示例 |
^ | 匹配文本的开始字符 | ‘^b’ 匹配以字母 b 开头的字符串 | book、big、banana、bike |
$ | 匹配文本的结束字符 | ‘st$’ 匹配以 st 结尾的字符串 | test、resist、persist |
. | 匹配任何单个字符 | ‘b.t’ 匹配任何 b 和 t 之间有一个字符 | bit、bat、but、bite |
* | 匹配前面的字符 0 次或多次 | ‘f*n’ 匹配字符 n 前面有任意个字符 f | fn、fan、faan、abcn |
+ | 匹配前面的字符 1 次或多次 | ‘ba+’ 匹配以 b 开头,后面至少紧跟一个 a | ba、bay、bare、battle |
? | 匹配前面的字符 0 次或1次 | ‘sa?’ 匹配0个或1个a字符 | sa、s |
字符串 | 匹配包含指定字符的文本 | ‘fa’ 匹配包含‘fa’的文本 | fan、afa、faad |
[字符集合] | 匹配字符集合中的任何一个字符 | ‘[xz]’ 匹配 x 或者 z | dizzy、zebra、x-ray、extra |
[^] | 匹配不在括号中的任何字符 | ‘[^abc]’ 匹配任何不包含 a、b 或 c 的字符串 | desk、fox、f8ke |
字符串{n,} | 匹配前面的字符串至少 n 次 | ‘b{2}’ 匹配 2 个或更多的 b | bbb、bbbb、bbbbbbb |
字符串 | |||
{n,m} | 匹配前面的字符串至少 n 次, 至多 m 次 | ‘b{2,4}’ 匹配最少 2 个,最多 4 个 b | bbb、bbbb |
2.例子
2.1 查询 name 字段以j开头的记录
select * from person where name REGEXP '^j'
2.2 查询 name 字段以“y”结尾的记录
select * from person where name REGEXP 'y$'
2.3 查询 name 字段值包含“a”和“y”,且两个字母之间只有一个字母的记录
select * from person where name REGEXP 'a.y'
2.4 查询 name 字段值包含字母“T”,且“T”后面出现字母“h”的记录
select * from person where name REGEXP 'Th*'
2.5 查询 name 字段值包含字母“T”,且“T”后面至少出现“h”一次的记录
select * from person where name REGEXP 'Th+'
2.6 查询 name 字段值包含字母“S”,且“S”后面出现“a”一次或零次的记录
select * from person where name REGEXP 'sa?'
2.7 查询 name 字段值包含字符串“an”的记录
select * from person where name REGEXP 'an'
2.8 查询 name 字段值包含字符串“an”或“en”的记录
指定多个字符串时,需要用|隔开。只要匹配这些字符串中的任意一个即可。
select * from person where name REGEXP 'an|en'
2.9 查询 name 字段值包含字母“i”或“o”的记录
select * from person where name REGEXP '[io]'
方括号[ ]还可以指定集合的区间。例如,“[a-z]”表示从 a~z 的所有字母;“[0-9]”表示从 0~9 的所有数字;“[a-z0-9]”表示包含所有的小写字母和数字;“[a-zA-Z]”表示匹配所有字符。MySQL中的正则表达式匹配不区分大小写。为区分大小写,可使用BINARY关键字。
select * from person where name REGEXP BINARY '^[a-z]'
2.10 查询 name 字段值包含字母 a~t 以外的字符的记录
select * from person where name REGEXP '[^a-t]'
2.11 查询 name 字段值出现字母‘e’ 至少 2 次的记录
select * from person where name REGEXP 'e{2,}'
2.12 查询 name 字段值出现字符串“i” 最少 1 次,最多 3 次的记录
select * from person where name REGEXP 'i{1,3}'
所需表和数据:
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(40) NULL DEFAULT NULL,
`heigh` int(40) NULL DEFAULT NULL,
`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `person` VALUES ('Thomas ', 25, 168, '男');
INSERT INTO `person` VALUES ('Tom ', 20, 172, '男');
INSERT INTO `person` VALUES ('Dany', 29, 175, '男');
INSERT INTO `person` VALUES ('Jane', 27, 171, '男');
INSERT INTO `person` VALUES ('Susan', 24, 173, '女');
INSERT INTO `person` VALUES ('Green', 25, 168, '女');
INSERT INTO `person` VALUES ('Henry', 21, 160, '女');
INSERT INTO `person` VALUES ('Lily', 18, 190, '男');
INSERT INTO `person` VALUES ('LiMing', 19, 187, '男');