mysql正则REGEXP学习练习笔记

REGEXP在mysql是用来执行正则表达式的一个函数,像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。


 


MySql用户手册建议,在构造简单查询时,仍使用通配符。


如:Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];
但在一些特殊查询中,不用正则表达式是不行的。MYSQL提供的正则表达式WHERE谓词有三个,分别是:
REGEXP, RLIKE, NOT RLIKE
用这三个替换原有的LIKE谓词,后面即可以跟正则表达式。
例如要查询字段中含有“_”的数据,则要用以下查询语句:
SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';
扩展正则表达式的一些字符是:
· ‘.’匹配任何单个的字符。
· 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
· “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。
如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。 
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。 
为了找出以“b”开头的名字,使用“^”匹配名字的开始:
使用正则
SELECT * FROM pet WHERE name REGEXP BINARY ‘^b’;
SELECT * FROM pet WHERE name REGEXP ‘fy$’;
SELECT * FROM pet WHERE name REGEXP ‘w’;
SELECT * FROM pet WHERE name REGEXP ‘^…..$’;
SELECT * FROM pet WHERE name REGEXP ‘^.{5}$’;


今天在应用中遇到了这样的一个问题, 
有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2
需要从里面搜索出比如说:第一个逗号前的数字范围为3-5之间,第三个逗号前的数字的范围为3-5之间,第10个逗号前的数字范围为3-5之间,其余的都为1-5之间。。。
则sql语句可以这么写:
    SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';
1. 使用LIKE和NOT LIKE比较操作符(注意不能使用=或!=);
2. 模式默认是忽略大小写的;
3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);


附一些mysql正则规则
^                         匹配字符串的开始部分
$                         匹配字符串的结束部分
.                          匹配任何字符(包括回车和新行)
a*                       匹配0或多个a字符的任何序列
a+                       匹配1个或多个a字符的任何序列
a?                       匹配0个或1个a字符
de|abc               匹配序列de或abc
(abc)*                匹配序列adc的0个或者多个实例
 
{n}、{m,n}        {n}或{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或“部分”)。m和n均为整数。
a*              可被写为a{0,}
a+              可被写为a{1,}
a?              可被写为a{0,1}
 
[a-dX]                 匹配任何是a,b,c,d或者X的字符,两个其他字符之间的’-'字符构成一个范围
[^a-dX]               匹配任何不是a,b,c,d或者X的字符,前面的字符’^'是否定的意思
 
[.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> select ‘fang shan zi’ regexp ‘[[:<:]]shan[[:>:]]’;             -> 1
mysql> select ‘fang shan zi’ regexp ‘[[:<:]]fang[[:>:]]’;              -> 1
mysql> select ‘fang shans zi’ regexp ‘[[:<:]]shan[[:>:]]’;           -> 0
 
正则表达式使用特殊字符,应在其前面加上2个反斜杠’'字符
mysql> SELECT ’1+2′ REGEXP ’1+2′;                       -> 0
mysql> SELECT ’1+2′ REGEXP ’1+2′;                      -> 0
mysql> SELECT ’1+2′ REGEXP ’1\+2′;                     -> 1

你可能感兴趣的:(mysql正则REGEXP学习练习笔记)