-
mysql正则表达式区分大小写
Mysql中Regexp常见用法
模糊匹配,包含特定字符串
# 查找content字段中包含“车友俱乐部”的记录
select * from club_content where content regexp '车友俱乐部'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '%车友俱乐部%'
模糊匹配,以特定字符串开头
# 查找content字段中以“车友”开头的记录
select * from club_content where content regexp '^车友'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '车友%'
模糊匹配,以特定字符串结尾
# 查找content字段中以“车友”结尾的记录
select * from club_content where content regexp '车友$'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '%车友'
模糊匹配,或关系
# 查找content字段中包含“心得”、“分享”或“技术贴”
select * from club_content where content REGEXP '心得|分享|技术贴'
模糊匹配,不包含单个字符
# 查找content字段中不包含“车”字、“友”字的记录
select * from club_content where content REGEXP [^车友]
这个结果跑出来一看大吃一惊,竟然把所有记录给跑出来,这是为什么呢?
因为一旦加了这个方括号"[]",它就把里面的内容拆成单个的字符再匹配,它会逐个字符去匹配判断是不是等于“车”,或者是不是等于“友“,返回的结果是一组0、1的逻辑值。
如果想匹配不包含特定字符串,该怎么实现呢?
模糊匹配,不包含特定字符串
# 查找content字段不包含“车友”字符串的记录
select * from club_content where content not REGEXP '车友'
MySql REGEXP运算符匹配字符串
1 ^ 匹配以该字符后面的字符开头的字符串
举个例子: REGEXP ‘^x' 表示匹配以x开头的字符
2 $匹配以该字符前面的字符结尾的字符串
举个例子: REGEXP ‘y$' 表示匹配以y结尾的字符
3 .匹配任意一个字符
4 […]匹配在方括号中的任意一个字符。
如: [1-9] 匹配1到9的数字, [abc]匹配其中任意一个
5 *匹配零个或多个在它前面的字符
如: x* 匹配任何数量的x字符
select ('123a' REGEXP '[0-9]') 表示是否包含数字字符,1为是,0为否。
select ('123a' REGEXP '[^0-9]') 表示是否包含不是数字的字符,1为是,0为否。(此处运行结果为1,因为a是不含数字)(注意含不是数字!=不含数字)
举例:
一、mysql判断是不是数字
SELECT '1.1' REGEXP '[0-9.]'
结果为1表示true 当然也可以使用SELECT '1.1' REGEXP '[^0-9.]',结果为0表示false。
二、mysql判断是不是包含字母
不区分大小写:SELECT '1AA' REGEXP '[a-z]'
区分大小写:SELECT '1AA' REGEXP BINARY '[a-z]'
或:SELECT '1AA' REGEXP BINARY '[A-Z]'
结果为1表示true,结果为0表示false。
举例:筛选名字(@后面且倒数第2位中含有小写字母)的用户信息
select distinct id,name,email,created_at
,case when instr(name,'@')<=0 then '未添加账龄后缀'
when substr(substring_index(name,'@','-1'),1,1) REGEXP BINARY '[a-z]' then '大小写混用'
else null end as incorrect_type
from `cuishou-db`.users
where (role_id='1' and instr(name,'@')<=0) or substr(substring_index(name,'@','-1'),1,1) REGEXP BINARY '[a-z]'
模糊匹配,包含特定字符串
# 查找content字段中包含“车友俱乐部”的记录
select * from club_content where content regexp '车友俱乐部'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '%车友俱乐部%'
模糊匹配,以特定字符串开头
# 查找content字段中以“车友”开头的记录
select * from club_content where content regexp '^车友'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '车友%'
模糊匹配,以特定字符串结尾
# 查找content字段中以“车友”结尾的记录
select * from club_content where content regexp '车友$'
# 此时的regexp与like的以下用法是等同的
select * from club_content where content like '%车友'
模糊匹配,或关系
# 查找content字段中包含“心得”、“分享”或“技术贴”
select * from club_content where content REGEXP '心得|分享|技术贴'
模糊匹配,不包含单个字符
# 查找content字段中不包含“车”字、“友”字的记录
select * from club_content where content REGEXP [^车友]
这个结果跑出来一看大吃一惊,竟然把所有记录给跑出来,这是为什么呢?
因为一旦加了这个方括号"[]",它就把里面的内容拆成单个的字符再匹配,它会逐个字符去匹配判断是不是等于“车”,或者是不是等于“友“,返回的结果是一组0、1的逻辑值。
如果想匹配不包含特定字符串,该怎么实现呢?
模糊匹配,不包含特定字符串
# 查找content字段不包含“车友”字符串的记录
select * from club_content where content not REGEXP '车友'
MySql REGEXP运算符匹配字符串
1 ^ 匹配以该字符后面的字符开头的字符串
举个例子: REGEXP ‘^x' 表示匹配以x开头的字符
2 $匹配以该字符前面的字符结尾的字符串
举个例子: REGEXP ‘y$' 表示匹配以y结尾的字符
3 .匹配任意一个字符
4 […]匹配在方括号中的任意一个字符。
如: [1-9] 匹配1到9的数字, [abc]匹配其中任意一个
5 *匹配零个或多个在它前面的字符
如: x* 匹配任何数量的x字符
select ('123a' REGEXP '[0-9]') 表示是否包含数字字符,1为是,0为否。
select ('123a' REGEXP '[^0-9]') 表示是否包含不是数字的字符,1为是,0为否。(此处运行结果为1,因为a是不含数字)(注意含不是数字!=不含数字)
举例:
一、mysql判断是不是数字
SELECT '1.1' REGEXP '[0-9.]'
结果为1表示true 当然也可以使用SELECT '1.1' REGEXP '[^0-9.]',结果为0表示false。
二、mysql判断是不是包含字母
不区分大小写:SELECT '1AA' REGEXP '[a-z]'
区分大小写:SELECT '1AA' REGEXP BINARY '[a-z]'
或:SELECT '1AA' REGEXP BINARY '[A-Z]'
结果为1表示true,结果为0表示false。
举例:筛选名字(@后面且倒数第2位中含有小写字母)的用户信息
select distinct id,name,email,created_at
,case when instr(name,'@')<=0 then '未添加账龄后缀'
when substr(substring_index(name,'@','-1'),1,1) REGEXP BINARY '[a-z]' then '大小写混用'
else null end as incorrect_type
from `cuishou-db`.users
where (role_id='1' and instr(name,'@')<=0) or substr(substring_index(name,'@','-1'),1,1) REGEXP BINARY '[a-z]'