【MySql】1.3 使用正则表达式搜索

1、正则表达式介绍
   正则表达式用来匹配文本的特殊的串(字符集合)。

2、使用MySQL正则表达式mysql

一、MySQL仅仅支持多数正则表达式实现的一个很小的子集
二、LIKE匹配整个列值;而REGEXP匹配列值的子串

git

  若是被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。
mysql>select * from students;
+--------+-----------+
|number | name1|
+--------+-----------+
|1 | space|
|2 | warmspace |
+--------+-----------+正则表达式


mysql>select name1 from students where name1 like 'space';   全名匹配
+-------+
|name1 |
+-------+
|space |
+-------+

mysql>select name1 from students where name1 REGEXP 'space';  子串匹配
+-----------+
|name1|
+-----------+
|space|
|warmspace |
+-----------+sql


三、默认MySQL中的正则表达式匹配不区分大小写,可以使用BINARY关键字区分大小写
mysql> select name1 from students where name1 REGEXP 'SPACE';
+-----------+
| name1     |
+-----------+
| space     |
| warmspace |
+-----------+数据库

mysql> select name1 from students where name1 REGEXP BINARY 'SPACE';
Empty set (0.00 sec)api


四、进行OR匹配:为搜索两个串之一,使用|
mysql> select * from students;
+--------+-----------+------+
| number | name1      | age  |
+--------+-----------+------+
|      1 | space      |   15 |
|      2 | warmspace  |   34 |
|      3 | summerspace |  28 |
+--------+-----------+------+
2 rows in set (0.00 sec)

mysql> select * from students where age REGEXP '1|4';
+--------+-----------+------+
| number | name1     | age  |
+--------+-----------+------+
|      1 | space     |   15 |
|      2 | warmspace |   34 |
+--------+-----------+------+ide


五、匹配几个字符之一:匹配任何单一字符
[]是另外一种形式的OR语句。'005-[123]'与’005-[1|2|3]’是等价的。
mysql> select * from students;
+--------+-------------+------+-----------------+
| number | name1       | age  | id              |
+--------+-------------+------+-----------------+
|      1 | space       |   15 | 101-02-01-005-2 |
|      2 | warmspace   |   34 | 101-02-01-005-1 |
|      3 | summerspace |   28 | 101-02-01-005-3 |
|      4 | abc         |   20 | 101-02-01-005-4 |
+--------+-------------+------+-----------------+

mysql> select name1,id from students where id REGEXP '005-[123]';
+-------------+-----------------+
| name1       | id              |
+-------------+-----------------+
| space       | 101-02-01-005-2 |
| warmspace   | 101-02-01-005-1 |
| summerspace | 101-02-01-005-3 |
+-------------+-----------------+

匹配除给定字符外的字符:
mysql> select name1,id from students where id REGEXP '005-[^123]';
+-------+-----------------+
| name1 | id              |
+-------+-----------------+
| abc   | 101-02-01-005-4 |
+-------+-----------------+测试


六、可以使用-来定义一个范围
如[1-9],[a-b]。
mysql> select name1,id from students where id REGEXP '005-[1-3]';
+-------------+-----------------+
| name1       | id              |
+-------------+-----------------+
| space       | 101-02-01-005-2 |
| warmspace   | 101-02-01-005-1 |
| summerspace | 101-02-01-005-3 |
+-------------+-----------------+spa


七、为了匹配特殊字符,必须用\\为前导
例如\\-,\\.等。这种处理即转义(escaping)。多数正则表达式实现使用单个反斜杠转义特殊字符,但MYSQL要求两个(MYSQL本身解释一个,正则表达式库解释另外一个)。\\也用来引用元字符(具备特殊含义的字符),以下表:regexp

元字符

说明

\\f

换页

\\n

换行

\\r

回车

\\t

制表

\\v

纵向制表


八、为了更方便工做,能够使用预约义的字符集,称为字符类(character class)
mysql> select name1,age from students where age REGEXP '[[:digit:]]';
+-------------+------+
| name1       | age  |
+-------------+------+
| space       |   15 |
| warmspace   |   34 |
| summerspace |   28 |
| abc         |   20 |
+-------------+------+

说明

[:alnum:]

任意字母和数字([a-zA-Z0-9])

[:alpha:]

任意字符([a-zA-Z])

[:blank:]

空格和制表([\\t])

[:cntrl:]

ASCII控制字符(ASCII 031127)

[:digit:]

任意数字([0-9])

[:graph:]

[:print:]相同,但不包括空格

[:lower:]

任意小写字母([a-z])

[:print:]

任意可打印字符

[:punct:]

既不在[:alnum:]又不在[:cntrl:]中的任意字符

[:space:]

包括空格在内的任意空白字符([\\f\\n\\r\\t\\v])

[:upper:]

任意大写字母([A-Z])

[:xdigit:]

任意十六进制数字([a-fA-F0-9])


九、使用正则表达式重复元字符匹配多个实例
mysql> select * from students;
+--------+-------------+------+-----------------+
| number | name1       | age  | id              |
+--------+-------------+------+-----------------+
|      1 | space       |   15 | 101-02-01-005-2 |
|      2 | warmspace   |   34 | 101-02-01-005-1 |
|      3 | summerspace |   28 | 101-02-01-005-3 |
|      4 | abc         |   20 | 101-02-01-005-4 |
+--------+-------------+------+-----------------+

mysql> select * from students where name1 REGEXP 'm{2}';
+--------+-------------+------+-----------------+
| number | name1       | age  | id              |
+--------+-------------+------+-----------------+
|      3 | summerspace |   28 | 101-02-01-005-3 |
+--------+-------------+------+-----------------+

元字符

说明

*

0个或多个匹配

+

1个或多个匹配(等于{1,}

?

0个或1个匹配(等于{0,1}

{n}

指定数目的匹配

{n,}

很多于指定数目的匹配

{n,m}

匹配数目的范围(m不超过255


十、定位符(为了匹配特定位置的文本)
mysql> select * from students where name1 REGEXP 'c$';
+--------+-------+------+-----------------+
| number | name1 | age  | id              |
+--------+-------+------+-----------------+
|      4 | abc   |   20 | 101-02-01-005-4 |
+--------+-------+------+-----------------+

元字符

说明

^

文本的开始

$

文本的结尾

[[:<:]]

词的开始

[[:>:]]

词的结尾


十一、简单的正则表达式测试:能够在不使用数据库表的状况下用SELECT来测试正则表达式REGEXP检查老是返回0或1(匹配)。mysql> select 'hello' regexp '[0-9]';+------------------------+| 'hello' regexp '[0-9]' |+------------------------+|                      0 |+------------------------+

相关文章
相关标签/搜索