MySQL——正则表达式

来源:互联网 发布:泉州市网络推手 编辑:程序博客网 时间:2024/06/08 12:27

MySQL入门大多人都喜欢使用like,但是作为IT人员,like不足以满足我们装X的虚荣心的,所以给大家分享一下mysql中正则表达式的使用详解,希望便于大家的理解与使用,提升我们的逼格。

一、元字符:

^   字符串的开始  $  字符串的结尾  .   任何单个字符  [...]   在方括号内的任何字符列表  [^...]  非列在方括号内的任何字符  p1|p2|p3    交替匹配任何模式P1,P2或P3  *    零个或多个前面的元素  +    前面的元素的一个或多个实例  {n}     前面的元素的n个实例  {m,n}   m到n个实例前面的元素  

1、(^)字符,匹配字符串的开始位置,如“^a”表示以字母a开头的字符串,代码如下:

SELECT * FROM star WHERE name REGEXP '^刘';#查询name以'刘'开头的名字,比如:刘丽,刘XxXSELECT * FROM star WHERE name REGEXP '^st';#查询name以'st'开头的名字,比如:stasa,st*** select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配)  select "fofo" REGEXP "^fo"; -> 1(表示匹配)

2、($)字符:匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串.

SELECT * FROM star WHERE name REGEXP '娜$';#查询name以'娜'结尾的名字,比如:谢娜,X娜SELECT * FROM star WHERE name REGEXP '高';#查询找到所有的名字包函'高'的字符串,比如:高山,楼高,登高远眺SELECT * FROM star WHERE name REGEXP '^周|杰$'#查询name以'周'开头并且以'杰'结尾的名字,比如:周小杰,周杰,周X杰SELECT * FROM my_user WHERE `name` REGEXP '^[0-9]{11}$';#比如手机号码是11位数字,也就是说a11111111111不行,但是他又具备11个数字条件。所以我们要求从头开始匹配到结尾,是11位数字。mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配) mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配) 

3、(.)字符:这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等.

mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配) mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配) 

4、(*)字符:星号匹配0个或多个字符,在它之前必须有内容,如:

a*:匹配任意多个a(包括空串)select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

5、(+)字符:加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。

a+:匹配任意多个a(不包括空串) select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配) 

6、(?)字符:问号匹配0次或1次.

a?:匹配一个或零个aselect "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

7、de|abc:匹配de或abc

select "pi" REGEXP "pi|apa"; -> 1(表示匹配)  select "axe" REGEXP "pi|apa"; -> 0(表示不匹配)  select "apa" REGEXP "pi|apa"; -> 1(表示匹配)  select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配)  select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配)  select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)#

注意看下面一条

SELECT * FROM my_user WHERE `name` REGEXP '[12]';

查询名字中包含有数字1或者数字2的记录,它是[1|2]的缩写。使用方括号将字符串括起来的写法,无论方括号内有多少字符串,其表达的含义都是匹配其中任意一个。如果是[123456789]那么就代表,匹配名字中包含1或2或3或4或5或6或7或8或9的任何一个记录。
当然,字符串还可以查询被否定的情况。[^12]如果在12之前加上一个^符号,那么就代表除了1**或**2外的字符串。

8、(abc)*:匹配任意多个abc(包括空串)

mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配)  mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配)  mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)

9、{1}{2,3}:这是一个更全面的方法,它可以实现前面好几种保留字的功能.

a*:可以写成a{0,} a+:可以写成a{1,} a?:可以写成a{0,1} 

在{}内只有一个整型参数i,表示字符只能出现i次;
在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;
在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下(包括i次和j次)。
其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255)。
如果有两个参数,第二个必须大于等于第一个.

二、匹配一个范围
[a-dX]:匹配“a”、“b”、“c”、“d”或“X”
[^a-dX]:匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。
“[”、“]”必须成对使用.

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';#这个表达式将会匹配出所有名字中包含数字的记录。拆开理解就是,包含0或者1或者2...或者8或者9的记录。SELECT * FROM my_user WHERE `name` REGEXP '[0-9a-zA-Z]';#这个表达式就十分强大了,可以表示包含数字,小写字母,大写字母的所有记录。select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配)  select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配)  select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配)  select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)  select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配)  select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

三、匹配特殊字符串
我们来看下下面的一条语句:

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';

这个语句的意思是匹配名称包含所有数字的记录。0-9被方括号扩了起来,那么假设我现在就需要匹配方阔号该如何处理?

这个时候就需要用到匹配特殊字符的知识。为了匹配这些特殊的字符,我们需要使用转义功能,就是使用(双反斜杠)作为前导。假设我们需要匹配常用特殊字符即可这么写:

\\[ 匹配左方括号\\. 匹配点号\\] 匹配右方括号\\| 匹配竖线\\\ 匹配反斜杠自己本身

双反斜杠加上一些字母还可以表示特殊的含义。比如:

\\f 换页\\n 换行\\r 回车\\t 制表符\\v 纵向制表符

四、使用预定义字符集
虽然正则表达式提供了一些很长表示方式的缩写,比如[0-9]表示数字。[a-z]表示小写字母。但是,有些时候还是觉得复杂。所以,正则表达式还提供了一些预定义的字符类来方便我们开发。

简单来说,就像车牌使用苏代表江苏,而沪代表上海一样。

我们直接给出表直接参阅。

类 说明
[:alnum:] 任意数字和字母。相当于[a-zA-Z0-9] [:alpha:] 任意字符。相当于[a-zA-z]
[:blank:] 空格和制表。相当于[(双斜杠,segmentfault这里双斜杠打不出来)t]
[:cntrl:] ASCII控制字符(ASCII 0 到31和127) [:digit:] 任意数字。相当于[0-9]
[:graph:] 与[:print:]相同,但是不包含空格 [:lower:] 任意的小写字母。相当于[a-z]
[:print:] 任意可打印字符 [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符。 [:upper:] 任意大写字母。相当于[A-Z]
[:xdigit:] 任意十六进制的数字。相当于[a-fA-F0-9]

引用:
1、http://www.phpfensi.com/mysql/20140929/6412.html
2、https://segmentfault.com/a/1190000008256264

原创粉丝点击