MySQL學習足跡記錄07--數據過濾--用正則表達式進行檢索 本文用到的檢索數據
mysql> SELECT prod_name FROM products
-> ORDER BY prod_name;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Bird seed |
| Carrots |
| Detonator |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)
1.基本字符匹配
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '1000' #匹配"1000"
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '.000' #'.'表示匹配任意一個字符
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
2.進行OR匹配 為了搜索N個串之一,使用 ‘|’
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '1000 | 2000'
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
3.匹配幾個字符之一 *匹配特定的單字符,可以通過指定一組【】括起來的字符來完成
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '[123] Ton'
-> ORDER BY prod_name;
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
2 rows in set (0.00 sec)
等效於:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '[1|2|3] Ton'
-> ORDER BY prod_name;
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
2 rows in set (0.00 sec)
4.否定一個字符集‘^'
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '[^123] Ton'
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
+--------------+
1 row in set (0.00 sec)
5.匹配范圍【n-m】
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '[1-5] Ton'
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
3 rows in set (0.00 sec)
注:以下操作所用到的表格數據
mysql> SELECT vend_name FROM vendors ORDER BY vend_name; +----------------+ | vend_name | +----------------+ | ACME | | Anvils R Us | | Furball Inc. | | Jet Set | | Jouets Et Ours | | LT Supplies | +----------------+ 6 rows in set (0.00 sec)
6.匹配特殊字符,需用\\為前導,即轉義字符 *MySQL要求兩個反斜槓(MySQL自己解釋一個,正則表達式庫解釋另一個) 匹配'.'
eg:
mysql> SELECT vend_name FROM vendors
-> WHERE vend_name REGEXP '.' #未用轉義字符,所以不是期望的結果
-> ORDER BY vend_name;
+----------------+
| vend_name |
+----------------+
| ACME |
| Anvils R Us |
| Furball Inc. |
| Jet Set |
| Jouets Et Ours |
| LT Supplies |
+----------------+
6 rows in set (0.00 sec)
正確的應為:
mysql> SELECT vend_name FROM vendors
-> WHERE vend_name REGEXP '\\.'
-> ORDER BY vend_name;
+--------------+
| vend_name |
+--------------+
| Furball Inc. |
+--------------+
1 row in set (0.00 sec)
#以下7,8,9,10列出的僅作參考,無需記憶 7.匹配字符類 [:alnum:] ==> [a-zA-Z0-9] [:alpha:] ==> [a-zA-Z] [:blank:] ==>空格和制表符[\\t] [:cntrl:] ==>ASCII控制字符(ASCII0到31和127) [:digit:] ==>[0-9] [:graph:] ==>與[:print:]相同,但不包括空格 [:lower:] ==>[a-z] [:punct:] ==>即不在[:alnum:]又不在[:cntrl:]中的任意字符 [:space:] ==>包括空格在內的任意空白字符[\\f\\n\\r\\t\\v] [:upper:] ==>[A-Z] [:xdigit:]==>任意十六進制數[a-fA-F0-9] [:print:] ==>任意可打印字符 8.空白元字符 \\f ==>換頁 \\r ==>回車 \\v ==>縱向制表 9.匹配多個實例 重復元字符 * ==> 0個或多個匹配 + ==> 1個或多個匹配(等於{1,}) ? ==> 0個或1個匹配(等於{0,1}) {n} ==> 指定數目的匹配 {n,} ==> 不小於指定數目的匹配 {n,m} ==> 匹配數目的范圍(m<=255)
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '\\([0-9] sticks?\\) ' #'?'匹配它前面的任何字符的0次或1次出現
-> ORDER BY prod_name;
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
2 rows in set (0.00 sec)
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '[[:digit:]]{4}' #匹配連在一起的任意四位數字
-> ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
10.定位符
*定位元字符
^ ==> 文本的開始
$ ==> 文本的結尾
[[:<:]] ==> 詞的開始
[[:>:]] ==> 詞的結尾
eg:
mysql> SELECT prod_name FROM products
-> WHERE prod_name REGEXP '^[0-9\\.]' #'^'定位到串開頭,[0-9\\.]表示只有在'.'或任一數字為
-> ORDER BY prod_name; #串中的第一個字符,才匹配它
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
3 rows in set (0.00 sec)
11.'^'的雙重用途:在集合'[]'中用來否定集合,否則,用來指串的開始處