MySQL仅支持多数正则表达式实现的一个很小的子集。

基本字符匹配

匹配值column_name=’sql’:

select column_name from table_name where column_name REGEXP ‘sql’ order by column_name1;

匹配column_name LIKE ‘_sql’

select column_name from table_name where column_name REGEXP ‘.sql’ order by column_name1;

.是正则中一个特殊字符,表示匹配任意一个字符

TIPS:
LIKE&REGEXP差别:

select column_name from table_name where column_name like ‘1000’;

select column_name from table_name where column_name REGEXP ‘1000’;

若表中仅存在一行column_name=1000,那么LIKE不返回数据,REGEXP返回一行数据
原因:LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它(除非用通配符);
REGEXP在列值中进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的列会被返回。

TIPS:
MySQL3.23.4后,正则表达式匹配不区分大小写。
如需区分大小写,可使用BINARY关键字:

select column_name from table_name where column_name REGEXP BINARY ‘.SQL’;

进行OR匹配

搜索两个串之一:

select column_name from table_name where column_name REGEXP ‘100|200’;

返回column_name=100 OR column_name=200的行

两个以上的OR条件:

select column_name from table_name where column_name REGEXP ‘100|200|300’;

匹配几个字符之一

执行匹配特定的字符,通过指定一组用[和]括起来的字符来完成

select column_name from table_name where column_name REGEXP ‘[XYZ]123’;

会返回column_name=X123 OR column_name=Y123 OR column_name=Z123的行

[XYZ]123 是 [X|Y|Z]123 的缩写,可以使用后者

必须使用[]定义OR语句查找什么

select column_name from table_name where column_name REGEXP ‘X|Y|Z123’

这会检索到column_name=X123,column_name=Y123,column_name=’Z123’
还有额外的:column_name=’X’,column_name=’Y’,column_name=’Z123’

集合开始处加^符号,标识否定字符集合。因此[123]匹配1、2、3,但[^123]匹配除123以外的任意字符

匹配范围

集合可用来定义要匹配的一个或多个字符
匹配[0123456789]可用:[0-9]
匹配任何字母字符:[a-z]

select column_name from table_name where column_name REGEXP ‘[a-z]123’;

匹配到的值:a123, b123, c123 … z123, A123, B123, C123 … Z123
也能匹配:.a123,.z123…

匹配特殊字符

匹配特殊字符,必须用\为前导。\-代表查找-,\.代表查找.

slect column_name from table_name where column_name REGEXP ‘\.’

匹配到:ABC. ,.ABC , A.BC

\也用例引用元字符(具有特殊含义的字符)

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

TIPS

为了匹配反斜杠\本身,需要使用\\

匹配字符类

说明
[:alnum:] 任意字母和数字,同[a-zA-Z0-9]
[:alpha:] 任意字符,同[a-zA-Z]
[:blank:] 空格和制表,同[\\t]
[:cntrl:] ASCII控制字符,ASCII0到31和127
[:digit:] 任意数字,同[0-9]
[:lower:] 任意小写字母,同[a-z]
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:],又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意字符,同[\\f\\n\\r\\t\\v]
[:upper:] 任意大写字母[A-Z]
[:xdigit:] 任意十六进制数字,同[a-fA-F0-9]

匹配多个实例

前面的正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不到任何行。
但有时需要对匹配的数目进行更强的控制。例如:寻找所有的数,不论数中包含多少数字。
重复元字符

元字符 说明
* 0个或多个匹配
+ 1个或更多匹配,等于{1,}
? 0个或1个匹配,等于{0,1}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

select column_name from table_name where column_name REGEXP ‘\([0-9] abcd?\)’;

其中\(和\)匹配括号,[0-9]匹配任意数字,abcd?匹配abc和abcd(?匹配它前面的任何字符0次或1次出现)

匹配连在一起的4位数字:

select column_name from table_name where column_name REGEXP ‘[[:digit:]]{4}’

等价于:

select column_name from table_name where column_name REGEXP ‘[0-9][0-9][0-9][0-9]’

定位符

为了匹配特定位置的文本,需要使用定位符

元字符 说明
^ 文本的开始
$ 文本的结束
[[:<:]] 词的开始
[[:>:]] 词的结尾

检索以数字开始的值(包含小数点):

select column_name from table_name where column_name REGEXP ‘^[0-9\.]’;

等价于:

select column_name from table_name where column_name REGEXP ‘^[[:digit:]\.]’

TIPS

在集合中[]使用^,代表否定该集合。否则用来指串的开始处

TIPS

不使用数据库表,也可以用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。可以用带字符串的REGEXP来测试表达式,例如:

select ‘hello’ regexp ‘[0-9]’

由于文本hello不包含数字,那么将返回0