由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)
在select中类似下面使用,结果:匹配返回1,不匹配返回0
select "fo" REGEXP "^fo$"
扩展正则表达式的一些字符:
'.' 匹配任何单个的字符。
[...] 匹配在方括号内的任何字符。例如,"[abc]"匹配"a"、"b"或"c"。为了命名字符的范围,使用一个"-"。"[a-z]"匹配任何字母,而"[0-9]"匹配任何数字
" * " 匹配零个或多个在它前面的字符。例如,"x*"匹配任何数量的"x"字符,"[0-9]*"匹配任何数量的数字,而".*"匹配任何数量的任何字符
"^"\"$" 匹配被测试值的开始\结尾
{m[,n]} 内只有一个整型参数m,表示字符只能出现m次;
后面跟一个",",表示字符可以出现m次及以上;
后面跟一个",n",表示字符只能出现m次及以上,n次及以下 ;
其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255) 如果同时给定了m和n,m必须小于或等于n.
[a-dX]
[^a-dX]
匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的"-"字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。
例如,[0-9]匹配任何十进制数字 。
要想包含文字字符"]",它必须紧跟在开括号"["之后。
要想包含文字字符"-",它必须首先或最后写入。
对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。
BINARY 想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串
在select中类似下面使用,结果:匹配返回1,不匹配返回0
select "fo" REGEXP "^fo$"
扩展正则表达式的一些字符:
'.' 匹配任何单个的字符。
[...] 匹配在方括号内的任何字符。例如,"[abc]"匹配"a"、"b"或"c"。为了命名字符的范围,使用一个"-"。"[a-z]"匹配任何字母,而"[0-9]"匹配任何数字
" * " 匹配零个或多个在它前面的字符。例如,"x*"匹配任何数量的"x"字符,"[0-9]*"匹配任何数量的数字,而".*"匹配任何数量的任何字符
"^"\"$" 匹配被测试值的开始\结尾
{m[,n]} 内只有一个整型参数m,表示字符只能出现m次;
后面跟一个",",表示字符可以出现m次及以上;
后面跟一个",n",表示字符只能出现m次及以上,n次及以下 ;
其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255) 如果同时给定了m和n,m必须小于或等于n.
[a-dX]
[^a-dX]
匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的"-"字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。
例如,[0-9]匹配任何十进制数字 。
要想包含文字字符"]",它必须紧跟在开括号"["之后。
要想包含文字字符"-",它必须首先或最后写入。
对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。
BINARY 想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b'
#为了找出以"fy"结尾的名字,使用"$"匹配名字的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+——–+——–+———+——+————+——-+
| name| owner | species | sex | birth | death |
+——–+——–+———+——+————+——-+
| Fluffy | Harold | cat| f | 1993-02-04 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——–+——–+———+——+————+——-+
#为了找出包含正好5个字符的名字,使用"^"和"$"匹配名字的开始和结尾,和5个"."实例在两者之间:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen| cat| m | 1994-03-17 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
#你也可以使用"{n}""重复n次"操作符重写前面的查询:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen| cat| m | 1994-03-17 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
select "fonfo" REGEXP "^fo$";
#例子:
# 查找srv_keyword最后一个逗号','后的字符串,是null或者是以P-开头的,然后这部分删掉
# 如:专服务,规划类服务,P-1605061 | 专服务,规划类服务,null结果都应该是:专服务,规划类服务
# mysql找最后一个符号的位置没有直接的函数,用反转函数reverse间接实现
select product_name
,base_product_name
,srv_keyword
,REVERSE(substring(REVERSE(srv_keyword),LOCATE(',',REVERSE(srv_keyword))+1))
from srv
where srv_keyword not like CONCAT("%",product_id,"%")
and srv_keyword REGEXP ',(null|(P-.*))$'