首先說下LIKE命令都涉及到的通配符:
- % 替代一個或多個字符
- _ 僅替代一個字符
- [charlist] 字符列中的任何單一字符
- [^charlist]或者[!charlist] 不在字符列中的任何單一字符
其中搭配以上通配符可以讓LIKE命令實現多種技巧:
1、LIKE'Mc%' 將搜索以字母 Mc 開頭的所有字符串(如 McBadden)。
2、LIKE'%inger' 將搜索以字母 inger 結尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 將搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 將搜索以字母 heryl 結尾的所有六個字母的名稱(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 將搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 將搜索以字符串 inger 結尾、以從 M 到 Z 的任何單個字母開頭的所有名稱(如 Ringer)。
7、LIKE'M[^c]%' 將搜索以字母 M 開頭,並且第二個字母不是 c 的所有名稱(如MacFeather)。
不過,MySQL 、SQLite 只支持 % 和 _ 通配符,不支持 [^charlist] 或 [!charlist] 通配符( MS Access 支持,微軟 office 對通配符一直支持良好,但微軟有時候的通配符不支持 %,而是 *,具體看對應軟件說明)。通配符和正則不是一回事。
MySQL 和 SQLite 會把 like '[xxx]yyy' 的中括號當成普通字符,而不是通配符。
比如:
select * from persons WHERE City LIKE '[b]eijing'
將查出 city 為 [b]eijing 的行,而不是 city 為 beijing 的行。
MySQL 中要完成 [^charlist] 或 [!charlist] 通配符的查詢效果,需要通過正則表達式來完成。
select * from persons WHERE City REGEXP '[b]eijing' SQLite不支持Regexp正則方法。
(^)字符
匹配字符串的開始位置,如“^a”表示以字母a開頭的字符串。
mysql>
SELECT
name
FROM
person_tbl
WHERE
name
REGEXP "
^st"
;
($)字符
匹配字符串的結束位置,如“X$”表示以字母X結尾的字符串。
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
(.)字符
這個字符就是英文下的點,它匹配任何一個字符,包括回車、換行等。
(*)字符
星號匹配0個或多個字符,在它之前必須有內容。如:
mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)
(+)字符
加號匹配1個或多個字符,在它之前也必須有內容。加號跟星號的用法類似,只是星號允許出現0次,加號則必須至少出現一次。
mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)
(?)字符
問號匹配0次或1次。
mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)
a*
可以寫成a{0,}
a+
可以寫成a{1,}
a?
可以寫成a{0,1}
在{}內只有一個整型參數i,表示字符只能出現i次;在{}內有一個整型參數i,后面跟一個“,”,表示字符可以出現i次或i次以上;在{}內只有一個整型參數i,后面跟一個“,”,再跟一個整型參數j,表示字符只能出現i次以上,j次以下(包括i次和j次)。其中的整型參數必須大於等於0,小於等於 RE_DUP_MAX(默認是255)。 如果有兩個參數,第二個必須大於等於第一個。
(abc)*
匹配任意多個abc(包括空串)
mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)
[a-dX]
匹配“a”、“b”、“c”、“d”或“X”
[^a-dX]
匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。
mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配) mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配) mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配) mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配) mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)
正則匹配郵箱
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+[\.][a-zA-Z0-9_-]+$
要匹配.需要加轉義字符,並且必須放在[ ]里
正則匹配身份證號
匹配移動電話
中國移動 134.135.136.137.138.139.150.151.152.157.158.159.187.188 ,147
^1(3[4-9]|5[012789]|8[78])\d{8}$