MySQL的正则表达式?LIKE和REGEXP的区别?
1. Mysql的正则表达式仅仅使SQL语言的一个子集,能够匹配基本的字符、字符串。
例如:select * from wp_posts where post_name REGEXP 'hello',能够检索出列post_name中全部包含hello的行
REGEXP '.og' .是正则表达式中里一个特殊的字符。它表示匹配一个字符,所以,dog,hog,mog等等都能匹配。
注意:
关于LIKE和REGEXP的区别:LIKE匹配整个列。若是被匹配的文本仅在列值中出现,LIKE并不会找到它,相应的行也不会返回(固然,使用通配符除外)。而REGEXP在列值内进行匹配,若是被匹配的匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回,这时一个很是重要的差异(固然,若是适应定位符号^和$,能够实现REGEXP匹配整个列而不是列的子集)。
关于大小写的区分:MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写 。若是要区分大小写,应该使用BINARY关键字,如where post_name REGEXP BINARY 'Hello .000'
2.关于OR匹配
为了搜索两个串之一,使用|, 如,select * from products where pro_id REGEXP '1000|2000' ORDER BY pro_id;
这样就1000和2000都能匹配并返回,固然,使用多个|就能够匹配多个串
3.只是匹配几个字符[]
例如,这样将要匹配[0123456789]能够匹配0到9,[1-4][4-9]也是合法的范围。此外,范围不必定只是数值的,[a-z]匹配任意字母字符
如:SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
4.匹配特殊字符使用\进行转义
\\.可以匹配.
\\f换页
\\n换行
\\r回车
\\t制表
\\纵向制表
注意:为了匹配\自己,须要使用\\\
5.匹配字符类
[:alnum:] 任意字母和数字(通[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表符(同[\\t])
[:digit:] 任意数字(同[0-9])
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:space:] 包括空格在内的任意空白字符
6.匹配多个实例,关于重复元字符
* 0个或者多个匹配
+ 1个或者多个匹配(等于{1,})
? 1个或者多个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 很多于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
例子: select prod_name from products where prod_name REGEXP '[[:DIGIT:]]{4}' ,如前所述,[:digit:]匹配任意素子,于是它为数字的一个几何。{4}确切的要求它前面的字符(任意数字)出现3此,因此[[:digit:]]{4}匹配连在一块儿的任意4位数字,固然,上面的例子也能够这样写REGEXP '[0-9][0-9][0-9][0-9]'
7.定位符
^ 文本的开始
& 文本的结尾
[[:<:>
[[:>:]] 词的结尾
经过使用这些定位符,可以使REGEXP起相似LIKE的做用javascript
-------------------------------------------------------------------------------java
like模式git
like意思是长得像,有两个模式:_和%正则表达式
_表示单个字符,一般用来查询定长的数据,如查出全部姓王的三个字的人名,假设姓名列名为name,注意“王”后面有两个_sql
select name from 表名 where name like '王__';
%表示0个或多个任意字符,如查出全部姓王的人名post
select name from 表名 where name like '王%';
查出全部包含“华”字的人名spa
select name from 表名 where name like '%华%';
正则模式code
^,匹配字符串开始位置,仍是上面的例子,查询全部姓王的人名regexp
select name from 表名 where name regexp '^王';
$,匹配字符串结束位置,如查询全部姓名末尾是“明”的人名javascript正则
select name from 表名 where name regexp '明$';
.,匹配除\n以外的任意单个字符,相似于_,就不写sql语句了
[……],匹配[]中包含的任何一个字符,abcdef……xyz能够简写为[a-z],0123456789简写成[0-9],如查询出w/z/s开头的的人名
select name from 表名 where name regexp '^[wzs]';
[^……],匹配不包含在[]的字符,如查询出除了w/z/s开头以外的人名
select name from 表名 where name regexp '^[^wzs]';
a|b|c,匹配a或b或c,如将绩效为A-或A或A+的员工查出来,假设绩效列名performance
select performance from 表名 where performance regexp 'A-|A|A+';
*,重复0次或屡次,熟悉javascript正则的同窗都知道
'str*'能够匹配st/str/strr/strrr……
?,重复0次或1次
'str?'能够匹配st/str
+,重复1次或屡次
'str+'能够匹配str/strr/strrr/strrrr……
相比javascript里面的正则而言,这里的正则是简化版的,没有惰性匹配/贪婪匹配,[]内不支持\w\s\d这种语法,也不支持中文,相对简单。
须要注意的一点是:这两种模式不要混着用,like模式是不支持正则表达式的,REGEXP模式也不认识_和%