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®EXP差别:
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
