67SELECT语句:过滤(正则表达式REGEXP)序号说明操作
1REGEXP(正则表达式)LIKE替换成REGEXP
2匹配任意1个字符元字符:.
3OR匹配|
4匹配⼏个字符之⼀[a|b]
5匹配除指定字符外的字符[^a|b]
6匹配范围[a-b]
7匹配特殊字符以\\为前导
8引⽤元字符以\\为前导
9匹配字符类[:alnum:]、[:xdigit:]、[:alpha:]、[:upper:]等10匹配多个实例重复元字符总结
11匹配特定位置定位元字符总结
12LIKE与REGEXP⼆者差别
13匹配区分⼤⼩写REGEXP BINARY
以下为数据库SQLTEST中的三张表,其结构和内容如下:
1.REGEXP(正则表达式)
# 删除表记录
mysql> DELETE
-> FROM t_stu_profile
-> WHERE Stu_id IN (7,8,9);
# 插⼊表记录
mysql> INSERT t_stu_profile VALUES
-> (7, 'a1000', 'F', 20, '0614'),
-> (8, 'a2000', 'M', 21, '0611');
LIKE替换成REGEXP;
LIKE与REGEXP:
-> WHERE Gender REGEXP 'F';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      1 | 郭东    | F      |  16 | 0611    |
|      3 | 张北    | F      |  16 | 0613    |
|      5 | 王五    | F      |  17 | 0614    |
|      6 | 赵七    | F      |  16 | 0615    |
|      7 | a1000    | F      |  20 | 0614    |
+--------+----------+--------+------+----------+
2.匹配任意1个字符
.表⽰匹配任意1个字符
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP 'a.000';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      7 | a1000    | F      |  20 | 0614    |
|      8 | a2000    | M      |  21 | 0611    |
+--------+----------+--------+------+----------+
3.OR匹配
为搜素两个串之⼀,使⽤|;
两个以上的OR条件:'郭东|王五|张北'。
mysql> DELETE
-> FROM t_stu_profile
-> WHERE Stu_id IN (7,8,9,10);
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP '郭东|王五';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      1 | 郭东    | F      |  16 | 0611    |
|      5 | 王五    | F      |  17 | 0614    |
+--------+----------+--------+------+----------+
4.匹配⼏个字符之⼀
[]是另⼀种形式的OR语句。事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写。
-
> WHERE Class_id REGEXP '061[1|2|3]';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      1 | 郭东    | F      |  16 | 0611    |
|      2 | 李西    | M      |  18 | 0612    |
|      3 | 张北    | F      |  16 | 0613    |
|      4 | 钱南    | M      |  17 | 0611    |
+--------+----------+--------+------+----------+
5.匹配除指定字符外的字符
字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。为否定⼀个字符集,在集合的开始处放置⼀个^即可。
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Class_id REGEXP '061[^4|5]';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      1 | 郭东    | F      |  16 | 0611    |
|      2 | 李西    | M      |  18 | 0612    |
|      3 | 张北    | F      |  16 | 0613    |
|      4 | 钱南    | M      |  17 | 0611    |
+--------+----------+--------+------+----------+
6.匹配范围
集合可⽤来定义要匹配的⼀个或多个字符。如,[0123456789]等同于[0-9]。
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Class_id REGEXP '061[1-3]'
-> ORDER BY Age DESC;
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      2 | 李西    | M      |  18 | 0612    |
|      4 | 钱南    | M      |  17 | 0611    |
|      1 | 郭东    | F      |  16 | 0611    |
|      3 | 张北    | F      |  16 | 0613    |
+--------+----------+--------+------+----------+
7.匹配特殊字符
为了匹配特殊字符,必须⽤\\为前导。\\-表⽰查-,\\.表⽰查.;
为了匹配反斜杠字符\本⾝,需要使⽤\\\。
mysql> INSERT t_stu_profile
-> VALUES(7, '.1', 'F', 17, '0612');
-> WHERE Stu_Name REGEXP '\\.';
+--------+----------+--------+------+----------+
| Stu_id | Stu_Name | Gender | Age  | Class_id |
+--------+----------+--------+------+----------+
|      7 | .1      | F      |  17 | 0612    |
+--------+----------+--------+------+----------+
8.引⽤元字符
元字符:具有特殊含义的字符。
元字符说明
\\f换页
\\n换⾏
\\r回车
\\t制表
\\v纵向制表
9.匹配字符类
为更⽅便⼯作,可以使⽤预定义的字符集,称为字符类。
类说明等同[:alnum:]任意字母和数字[a-zA-Z0-9] [:xdigit:]任意⼗六制数字[a-fA-F0-9] [:alpha:]任意字符[a-zA-Z] [:upper:]任意⼤写字母[A-Z]
[:lower:]任意⼩写字母[a-z]
[:digit:]任意数字[0-9]
[:contrl:]ASCII控制字符ASCII 0到31和127 [:punct:]既不在[:alnum:]⼜不在[:contrl:]中的任意字符
[:blank:]空格和制表[\\t]
[:space:]包括空格在内的任意空⽩字符[\\f\\n\\r\\t\\v] [:print:]任意可打印字符
[:graph:]与[:print:]相同,但不包括空格
10.匹配多个实例
⽬前为⽌使⽤的所有正则表达式都试图匹配单次出现,但有时需要对匹配的数⽬进⾏更强的控制。
元字符说明等同.任意1个字符匹配
*0个或多个匹配
+1个或多个匹配{1,}
0个或1个字符{0,1}
{n}指定数⽬的匹配
{n,}不少于指定数⽬的匹配
{n,m}匹配数⽬的范围(m不超过255)
\\(是对(的转义;[0-9]匹配任意数字;tests?匹配test和tests,?匹配它前⾯的任何字符的0次或1次;\\)是对)的转义。
# 删除⾏:Stu_Name=.1
mysql> DELETE
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP '[//.].';
mysql> INSERT t_stu_profile
-> VALUES
-> (7, '(1 test)', 'F', 15, '0612'),
-> (8, '(2 tests)', 'M', 16, '0615');
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP '\\([0-9] tests?\\)';
+--------+-----------+--------+------+----------+
| Stu_id | Stu_Name  | Gender | Age  | Class_id |
+--------+-----------+--------+------+----------+
|      7 | (1 test)  | F      |  15 | 0612    |
|      8 | (2 tests) | M      |  16 | 0615    |
+--------+-----------+--------+------+----------+
mysql> SELECT *
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP '[\\(][1,2] tests?[\\)]'
-> ORDER BY Class_id DESC,Age DESC;
+--------+-----------+--------+------+----------+
| Stu_id | Stu_Name  | Gender | Age  | Class_id |
+--------+-----------+--------+------+----------+
|      8 | (2 tests) | M      |  16 | 0615    |
|      7 | (1 test)  | F      |  15 | 0612    |
+--------+-----------+--------+------+----------+
匹配连在⼀起的5个字符;
[:alpha:]匹配任意字符,{4}要求它前⾯的字符出现4次,所以[:alpha:]{4}匹配连在⼀起的任意4位字符,同[a-z][a-z][a-z][a-z]。
mysql> INSERT t_stu_profile
-> VALUES
-> (7, 'AAAA', 'F', 15, '0611'),
regex匹配-> (8, 'A1A1', 'M', 14, '0615');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。