正則表達式用來描述或者匹配符合規則的字符串。它的用法和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]’;
A-Z ↩︎