MySQL提供標準的SQL模式匹配,SQL模式匹配容許你使用「_」匹配任何單個字符,而「%」匹配任意數目字符(包括零字符)。。html
關於SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matchingmysql
1.MySQL僅僅支持多數正則表達式實現的一個很小的子集。正則表達式
2.SQL模式匹配容許你使用「_」匹配任何單個字符,而「%」匹配任意數目字符(包括零字符)。;而REGEXP使用擴展正則表達式匹配列值的子串,若是被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回。sql
注意使用SQL模式時,不能使用=或!=;而應使用LIKE或NOT LIKE比較操做符。數據庫
看下面的例子:api
mysql> select * from tb;測試
+----+------------+-----+regexp
| id | Name | Age |htm
+----+------------+-----+文檔
| 1 | changename | 20 |
+----+------------+-----+
1 row in set (0.02 sec)
要想找出正好包含5個字符的名字,使用「_」模式字符:
mysql> select * from tb where name like '_____';
Empty set (0.61 sec)
包含10個字符時,找出了匹配結果。
mysql> select * from tb where name like '__________';
+----+------------+-----+
| id | Name | Age |
+----+------------+-----+
| 1 | changename | 20 |
+----+------------+-----+
1 row in set (0.00 sec)
mysql> select name from tb where name regexp 'cha';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.06 sec)
mysql> select name from tb where name regexp 'chad';
Empty set (0.00 sec)
擴展正則表達式的一些字符是:
· ‘.’匹配任何單個的字符。
· 字符類「[...]」匹配在方括號內的任何字符。例如,「[abc]」匹配「a」、「b」或「c」。爲了命名字符的範圍,使用一個「-」。「[a-z]」匹配任何字母,而「[0-9]」匹配任何數字。
· 「 * 」匹配零個或多個在它前面的字符。例如,「x*」匹配任何數量的「x」字符,「[0-9]*」匹配任何數量的數字,而「.*」匹配任何數量的任何字符。
• 若是REGEXP模式與被測試值的任何地方匹配,模式就匹配(這不一樣於LIKE模式匹配,只有與整個值匹配,模式才匹配)。
• 爲了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用「^」或在模式的結尾用「$」。
3.默認MySQL中的正則表達式匹配不區分大小寫,可以使用BINARY關鍵字區分大小寫,如
mysql> select name from tb where name regexp binary'cha';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.08 sec)
mysql> select name from tb where name regexp binary'Cha';
Empty set (0.00 sec)
四、進行OR匹配:爲搜索兩個串之一,使用|,以下所示:
mysql> select name from tb where name regexp 'c|a';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.02 sec)
五、匹配幾個字符之一:
匹配任何單一字符。以下所示:
mysql> select name from tb where name regexp '[ca]';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.02 sec)
正如所見,[]是另外一種形式的OR語句。'[ca]'與’c|a’是等價的。
匹配除給定字符外的字符:
mysql> select name from tb where name regexp '^[ca]';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.00 sec)
六、可以使用-來定義一個範圍。如[1-9],[a-b]。
mysql> select name from tb where name regexp '[a-c]';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.00 sec)
mysql> select name from tb where name regexp '[w-z]';
Empty set (0.00 sec)
七、爲了匹配特殊字符,必須用\\爲前導,例如\\-,\\.等。這種處理即轉義(escaping)。
多數正則表達式實現使用單個反斜槓轉義特殊字符,但MYSQL要求兩個(MYSQL本身解釋一個,正則表達式庫解釋另外一個)。
\\也用來引用元字符(具備特殊含義的字符),以下表:
八、爲了更方便工做,能夠使用預約義的字符集,稱爲字符類(character class)。
mysql> select name from tb where name regexp '[[:alpha:]]';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.00 sec)
九、使用正則表達式重複元字符匹配多個實例:
mysql> select name from tb where name regexp 'c{1}';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.00 sec)
mysql> select name from tb where name regexp 'c{2}';
Empty set (0.00 sec)
十、定位符(爲了匹配特定位置的文本):
mysql> select name from tb where name regexp 'e$';
+------------+
| name |
+------------+
| changename |
+------------+
1 row in set (0.00 sec)
mysql> select name from tb where name regexp 'a$';
Empty set (0.00 sec)
十一、使REGEXP起相似LIKE的做用,它們的區別在於LIKE匹配整個串而REGEXP匹配子串。利用定位符,經過用^開始每一個表達式,用$結束每一個表達式。
十二、簡單的正則表達式測試:能夠在不使用數據庫表的狀況下用SELECT來測試正則表達式。REGEXP檢查老是返回0或1(匹配)。
[sql]
mysql> select 'hello' REGEXP'[0-9]';
+------------------------+
| 'hello' REGEXP '[0-9]' |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)
本文基於 <使用正則表達式搜索>整理造成。
官方文檔:Mysql正則表達式:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html