Mysql语句的RegExp的用法与案例

Mysql语句的RegExp的用法与案例

一、RegExp基本语法

1. JavaScript RegExp 参考手册
2. MySQL REGEXP:正则表达式查询
3. MySQL中REGEXP正则表达式使用大全

字符描述
^从开始行开始匹配
$从末端行开始匹配
.匹配任意单个字符除了换行符
[ ][ ] 内为字符集,匹配 [ ] 内任一字符
[^ ]匹配除了方括号里的任意字符
*匹配零个或多个在它前面的字 符
+匹配前面的字符 1 次或多次
?匹配 0 或 1 个 ?号前的字符。
{n,m}匹配前面的字符串至少 n 次, 至多 m 次
(xyz)匹配与 xyz 完全相等的字符串
\s匹配任意单个字符除了换行符
\转义字符,匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \
[.characters.]  在括号表达式中(使用[]),匹配用于校对元素的字符序列,字符为单个字符或新行等字符名

mysql> SELECT ‘~’ REGEXP ‘[[.~.]];                                                        -> 1

mysql> SELECT ‘~’ REGEXP ‘[[.tilde.]];                                                 -> 1

 

[=character_class=]

在括号表达式中(使用[]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,

[[=a=]]              等同于[a(+)],[a+],[a{1,}]

 

[:character_class:]

在括号表达式中(使用[]),[:character_class:]表示与术语类的所有字符匹配的字符类。

标准的类名称是:

alnum 		文字数字字符

alpha		文字字符

blank		空白字符

cntrl		控制字符

digit		数字字符

graph		图形字符

lower		小写文字字符

print		图形或空格字符

punct		标点字符

space		空格、制表符、新行、和回车

upper		大写文字字符

xdigit		十六进制数字字符

[[:<:]], [[:>:]]		
这些标记表示word边界,它们分别与word的开始和结束匹配
word是一系列字字符,其前面和后面均没有字字符。字符是alnum类中的字母数字字符或下划线(_)

二、Mysql使用RegExp案例

案例1:在json数据里面,找到class_detail_students_id这个字段,并且数据包含学生编号“58888828”

思路:
在这个数据 -> {"class_id":2,"class_detail_students_id":",58888881,58888828,58888881,"}
需要查找 -> class_detail_students_id 这个字段
并查看 -> ,58888881,58888828,58888881, 里面是否包含58888828
注意点:数据里面有双引号,这是regexp数据可以用单引号包围,里面的双引号用\\转义

匹配规则regexp ==>'(\\"class_detail_students_id\\")(:\\")[(0-9)|,]*(,58888828,)[(0-9)|,]*(\\")'


解答完整的sql:
select * from mole_class_detail_change where 
current_value regexp '(\\"class_detail_students_id\\")(:\\")[(0-9)|,]*(,58888828,)[(0-9)|,]*(\\")'

在这里插入图片描述

案例2:匹配000000002 _ _ _ _ _ _ _ _ 1900 和 000000003 _ _ _ _ _ _ _ _1700,其中"__" 这是8个空位,只能是数字

思路:
这是两个字符串,都空出中间8为数字,可以用"()"
(000000002) -> 匹配  "000000002"
[[:digit:]] -> 匹配  数字字符
{8}			-> 匹配前一个括号里面8次
|			-> 或的意思


解答完整的sql:
select * from mole_class_detail_change 
where class_detail_code regexp '((000000002)([[:digit:]]{8})(1900))|((000000003)([[:digit:]]{8})(1700))'

案例3:每个用户有多个身份权限,查询用户同时有a、b 、 c 权限的用户
在这里插入图片描述

上方截图展示了表数据 和分组查询的结果
.	->	匹配任意单个字符除了换行符
*	->	匹配零个或多个在它前面的字符
+	->	匹配1个或多个在它前面的字符
[abc]	->	匹配a/b/c里面的一个字符
[,|,.+,]	-> 	匹配','(逗号) 或者 ',abcfdg等等,'(逗号包围的数据)


匹配规则regexp	==>	 '.*,[abc][,|(,.+,)][abc][,|(,.+,)][abc][,|(,.+,)]'


解答完整的sql:
select user_id,concat(',',GROUP_CONCAT(DISTINCT role_id),',') as group_role from test GROUP BY user_id 
having group_role regexp '.*,[abc][,|(,.+,)][abc][,|(,.+,)][abc][,|(,.+,)]'

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值