MySQL正則表達式

正則表達式用來描述或者匹配符合規則的字符串。它的用法和like比較相似,但是它又比like更強大,能夠實現一些很特殊的規則匹配。
正則表達式需要使用REGEXP命令,匹配到返回"1",匹配不到返回"0",默認不加條件REGEXP相當於like ‘%%’。在前面加上NOT相當於NOT LIKE。
在這裏插入圖片描述
在字符串開始處進行匹配:^

mysql> select 'abc' regexp '^a';
+-------------------+
| 'abc' regexp '^a' |
+-------------------+
|                 1 |
+-------------------+

在字符串末尾開始匹配:$

mysql> SELECT  'abc' REGEXP 'a$';
+-------------------+
| 'abc' REGEXP 'a$' |
+-------------------+
|                 0 |
+-------------------+
mysql> SELECT  'abc' REGEXP 'c$';
+-------------------+
| 'abc' REGEXP 'c$' |
+-------------------+
|                 1 |
+-------------------+

匹配任意字符:.

mysql> SELECT  'abc' REGEXP '.a';
+-------------------+
| 'abc' REGEXP '.a' |
+-------------------+
|                 0 |
+-------------------+
mysql> SELECT  'abc' REGEXP '.b';
+-------------------+
| 'abc' REGEXP '.b' |
+-------------------+
|                 1 |
+-------------------+
mysql> SELECT  'abc' REGEXP '.c';
+-------------------+
| 'abc' REGEXP '.c' |
+-------------------+
|                 1 |
+-------------------+
mysql> SELECT  'abc' REGEXP 'a.';
+-------------------+
| 'abc' REGEXP 'a.' |
+-------------------+
|                 1 |
+-------------------+

匹配括號內的任意單個字符:[…]

mysql> SELECT  'abc' REGEXP '[xyz]';
+----------------------+
| 'abc' REGEXP '[xyz]' |
+----------------------+
|                    0 |
+----------------------+
mysql> SELECT  'abc' REGEXP '[xaz]';
+----------------------+
| 'abc' REGEXP '[xaz]' |
+----------------------+
|                    1 |
+----------------------+

匹配不在括號內的任意單個字符:[^…]
^符合只有在[]內纔是取反的意思,在別的地方都是表示開始處匹配。

mysql> SELECT  'a' REGEXP '[^abc]';
+---------------------+
| 'a' REGEXP '[^abc]' |
+---------------------+
|                   0 |
+---------------------+
mysql> SELECT  'x' REGEXP '[^abc]';
+---------------------+
| 'x' REGEXP '[^abc]' |
+---------------------+
|                   1 |
+---------------------+
mysql> SELECT  'abc' REGEXP '[^a]';
+---------------------+
| 'abc' REGEXP '[^a]' |
+---------------------+
|                   1 |
+---------------------+

REGEXP 前的匹配字符作爲一個整體,'abc’作爲一個整體,所以它匹配不了a。
匹配0個或多個a,包括空字符串:a*
可以作爲佔位符使用.有沒有指定字符都可以匹配到數據。

mysql> SELECT 'stab' REGEXP '.ta*b';
+-----------------------+
| 'stab' REGEXP '.ta*b' |
+-----------------------+
|                     1 |
+-----------------------+
mysql> SELECT 'stb' REGEXP '.ta*b';
+----------------------+
| 'stb' REGEXP '.ta*b' |
+----------------------+
|                    1 |
+----------------------+
mysql> SELECT '' REGEXP 'a*';
+----------------+
| '' REGEXP 'a*' |
+----------------+
|              1 |
+----------------+

匹配1個或者多個a,不包括空字符:a+

mysql> SELECT 'stab' REGEXP '.ta+b';
+-----------------------+
| 'stab' REGEXP '.ta+b' |
+-----------------------+
|                     1 |
+-----------------------+
mysql> SELECT 'stb' REGEXP '.ta+b';
+----------------------+
| 'stb' REGEXP '.ta+b' |
+----------------------+
|                    0 |
+----------------------+

匹配0個或者1個a:a?

mysql> SELECT 'stb' REGEXP '.ta?b';
+----------------------+
| 'stb' REGEXP '.ta?b' |
+----------------------+
|                    1 |
+----------------------+
mysql> SELECT 'stab' REGEXP '.ta?b';
+-----------------------+
| 'stab' REGEXP '.ta?b' |
+-----------------------+
|                     1 |
+-----------------------+
mysql> SELECT 'staab' REGEXP '.ta?b';
+------------------------+
| 'staab' REGEXP '.ta?b' |
+------------------------+
|                      0 |
+------------------------+

匹配a1或者a2:a1|a2

mysql> SELECT 'a' REGEXP 'a|b';
+------------------+
| 'a' REGEXP 'a|b' |
+------------------+
|                1 |
+------------------+
mysql> SELECT 'b' REGEXP 'a|b';
+------------------+
| 'b' REGEXP 'a|b' |
+------------------+
|                1 |
+------------------+
mysql> SELECT 'b' REGEXP '^(a|b)';
+---------------------+
| 'b' REGEXP '^(a|b)' |
+---------------------+
|                   1 |
+---------------------+
mysql> SELECT 'a' REGEXP '^(a|b)';
+---------------------+
| 'a' REGEXP '^(a|b)' |
+---------------------+
|                   1 |
+---------------------+
mysql> SELECT 'c' REGEXP '^(a|b)';
+---------------------+
| 'c' REGEXP '^(a|b)' |
+---------------------+
|                   0 |
+---------------------+

匹配m個a:a{m}

mysql> SELECT 'auuuuc' REGEXP 'au{4}c';
+--------------------------+
| 'auuuuc' REGEXP 'au{4}c' |
+--------------------------+
|                        1 |
+--------------------------+
mysql> SELECT 'auuuuc' REGEXP 'au{3}c';
+--------------------------+
| 'auuuuc' REGEXP 'au{3}c' |
+--------------------------+
|                        0 |
+--------------------------+

匹配m個或者更多個a:a{m,}

mysql> SELECT 'auuuuc' REGEXP 'au{3,}c';
+---------------------------+
| 'auuuuc' REGEXP 'au{3,}c' |
+---------------------------+
|                         1 |
+---------------------------+
mysql> SELECT 'auuuuc' REGEXP 'au{4,}c';
+---------------------------+
| 'auuuuc' REGEXP 'au{4,}c' |
+---------------------------+
|                         1 |
+---------------------------+
mysql> SELECT 'auuuuc' REGEXP 'au{5,}c';
+---------------------------+
| 'auuuuc' REGEXP 'au{5,}c' |
+---------------------------+
|                         0 |
+---------------------------+

匹配m到n個a,包含m和n:a{m,n}

mysql> SELECT 'auuuuc' REGEXP 'au{3,5}c';
+----------------------------+
| 'auuuuc' REGEXP 'au{3,5}c' |
+----------------------------+
|                          1 |
+----------------------------+
mysql> SELECT 'auuuuc' REGEXP 'au{4,5}c';
+----------------------------+
| 'auuuuc' REGEXP 'au{4,5}c' |
+----------------------------+
|                          1 |
+----------------------------+
mysql> SELECT 'auuuuc' REGEXP 'au{5,10}c';
+-----------------------------+
| 'auuuuc' REGEXP 'au{5,10}c' |
+-----------------------------+
|                           0 |
+-----------------------------+

將abc作爲一個序列匹配:(abc)
不用括號括起來都是用單個字符去匹配,如果要把多個字符作爲一個整體去匹配就需要用到括號,所以括號適合上面的所有情況。

mysql> SELECT 'xababy' REGEXP 'x(abab)y';
+----------------------------+
| 'xababy' REGEXP 'x(abab)y' |
+----------------------------+
|                          1 |
+----------------------------+
mysql> SELECT 'xababy' REGEXP 'x(ab)*y';
+---------------------------+
| 'xababy' REGEXP 'x(ab)*y' |
+---------------------------+
|                         1 |
+---------------------------+
mysql> SELECT 'xababy' REGEXP 'x(ab){1,2}y';
+-------------------------------+
| 'xababy' REGEXP 'x(ab){1,2}y' |
+-------------------------------+
|                             1 |
+-------------------------------+

總結:

  • 使用REGEXP和NOT REGEXP操作符(類似LIKE和NOT LIKE)
  • REGEXP默認也是不區分大小寫,可以使用BINARY關鍵詞強制區分大小寫: WHERE NAME REGEXP BINARY ‘1’;
  • REGEXP默認是部分匹配原則,即有一個匹配上則返回真。例如:SELECT ‘Abc’ REGEXP BINARY ‘[A-Z]’;

  1. A-Z ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章