MYSQL入門學習之二:使用正則表達式搜索
一、正則表達式介紹
www.2cto.com
正則表達式是用來匹配文本的特殊的串(字符集合)。
二、使用MySQL正則表達式
1、MySQL僅僅支持多數正則表達式實現的一個很小的子集。
2、LIKE匹配整個列值;而REGEXP匹配列值的子串,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回。看下面的例子:
www.2cto.com
[sql]
mysql>select username from v9_admin where username like 'space';
Emptyset (0.00 sec)
mysql>select username from v9_admin where username REGEXP 'space';
+-----------+
|username |
+-----------+
|warmspace |
+-----------+
1 rowin set (0.02 sec)
3、默認MySQL中的正則表達式匹配不區分大小寫,可使用BINARY關鍵字區分大小寫,如
[sql]
mysql>select username from v9_admin
-> where username REGEXP BINARY'SPACCE';
Emptyset (0.04 sec)
4、進行OR匹配:為搜索兩個串之一,使用|,如下所示:
[sql]
mysql>select roleid from v9_admin_role
-> where roleid REGEXP '1|3';
+--------+
|roleid |
+--------+
| 1 |
| 3 |
+--------+
2 rowsin set (0.00 sec)
5、匹配幾個字符之一:匹配任何單一字符。如下所示:
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[123]';
+-----------------+
|name |
+-----------------+
|101-02-01-005-2 |
|101-02-01-005-1 |
|101-02-01-005-3 |
+-----------------+
3 rowsin set (0.00 sec)
正如所見,[]是另一種形式的OR語句。'005-[123]'與’005-[1|2|3]’是等價的。
匹配除給定字符外的字符:
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[^123]';
+-------------------+
|name |
+-------------------+
|101-02-01-005-4.2 |
|101-02-01-005-4 |
|101-02-01-005-5 |
+-------------------+
3 rowsin set (0.00 sec)
6、可使用-來定義一個范圍。如[1-9],[a-b]。
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[1-3]';
+-----------------+
|name |
+-----------------+
|101-02-01-005-2 |
|101-02-01-005-1 |
|101-02-01-005-3 |
+-----------------+
3 rowsin set (0.00 sec)
7、為了匹配特殊字符,必須用\\為前導,例如\\-,\\.等。這種處理即轉義(escaping)。
多數正則表達式實現使用單個反斜槓轉義特殊字符,但MYSQL要求兩個(MYSQL自己解釋一個,正則表達式庫解釋另一個)。
\\也用來引用元字符(具有特殊含義的字符),如下表:
8、為了更方便工作,可以使用預定義的字符集,稱為字符類(character class)。
[sql]
mysql> select name fromv9_collection_node
-> where name REGEXP '[[:digit:]]';
+-------------------+
| name |
+-------------------+
| 101-10-01-002-1 |
| 101-02-01-005-4.2 |
| 101-02-01-005-2 |
| 101-02-01-005-1 |
| 101-02-01-005-3 |
| 101-02-01-005-4 |
| 101-02-01-005-5 |
| 101-10-01-002-2 |
| 101-11-04-001-1 |
+-------------------+
9 rowsin set (0.00 sec)
9、使用正則表達式重復元字符匹配多個實例:
[sql]
mysql> select name fromv9_collection_node
-> where name REGEXP '1{2}';
+-----------------+
| name |
+-----------------+
| 101-11-04-001-1 |
+-----------------+
1 rowin set (0.00 sec)
10、定位符(為了匹配特定位置的文本):
[sql]
mysql> select name from v9_collection_node
-> where name REGEXP '2$';
+-------------------+
| name |
+-------------------+
| 101-02-01-005-4.2 |
| 101-02-01-005-2 |
| 101-10-01-002-2 |
+-------------------+
3 rows in set (0.00 sec)
11、使REGEXP起類似LIKE的作用,它們的區別在於LIKE匹配整個串而REGEXP匹配子串。利用定位符,通過用^開始每個表達式,用$結束每個表達式。
12、簡單的正則表達式測試:可以在不使用數據庫表的情況下用SELECT來測試正則表達式。REGEXP檢查總是返回0或1(匹配)。
[sql]
mysql> select 'hello' REGEXP'[0-9]';
+------------------------+
| 'hello' REGEXP '[0-9]' |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)