我們先來看下商品名稱列
SELECT prod_name
FROM products;
現在如果我們想要匹配商品名含有“1000”的商品,如果用簡單匹配,應該是
SELECT prod_name
FROM products
WHERE prod_name LIKE "%1000%";
我們現在用正則表達式
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000';
感覺好像體現不出正則表達式的強大啊,好,看這個列子。如果我想同時得到含有1000和2000的商品名稱,該怎麼寫?簡單匹配應該這樣
SELECT prod_name
FROM products
WHERE prod_name LIKE "%1000%"
OR prod_name LIKE "%2000%";
使用正則表達式
SELECT prod_name
FROM products
WHERE prod_name REGEXP ".000";
是不是非常優雅?“.000”中的“.“匹配任意字符
當然,也可以使用正則表達式的”|“(OR)
SELECT prod_name
FROM products
WHERE prod_name REGEXP "1000|2000";
假設現在有范冰冰,李冰冰,黃冰冰,趙冰冰,王冰冰。我現在只想搜索兩個大明星范冰冰和李冰冰,怎麼用正則表達式查找?很簡單,使用”[]“來匹配多個字符之一。像上面這種要求我們可以寫出”[範李]冰冰“,[範李]定義了一組字符,意思是匹配”範“或者”李“。
好,現在我們的產品裏有1 ton anvil和2 ton anvil 現在用正則表達式匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP "[12] Ton";
這邊故意把ton寫出Ton,不影響搜索結果說明正則表達式不區分大小寫
那反過來想,我不想看范冰冰和李冰冰,我只想看其他的冰冰,該怎麼找?”[^範李]冰冰“就行了,^有取反的意思。
運用好集合可以輕鬆匹配一個或多個字符,比如
想匹配1~9數字
[123456789] 或者 [1-9]
想匹配字母a~z
[a-z]
匹配特殊字符
之前我們用”.“來匹配任意字符。我們看到商品名裏有.5 ton anvil這種名字,該怎麼搜索文本里含有特殊字符”.”的文本呢? 如果直接搜索
SELECT prod_name
FROM products
WHERE prod_name REGEXP ".";
結果是匹配所有的行,因爲”.“就是匹配任意字符。那怎麼辦呢?
使用轉義”\“就行了
SELECT prod_name
FROM products
WHERE prod_name REGEXP "\\.";
需要用到特殊字符的自身意義時,就在前面加”\”,比如搜索“\”就用“\\”
重複匹配
元字符 | 說明 |
---|---|
* | 0或多個匹配 |
+ | 1個或多個(等於{1,}) |
? | 0或1個(等於{0,1}) |
{n} | 重複n次 |
{n,} | 至少重複n次 |
{n,m} | 重複n~m次(m不超過255) |
現在我們用上面的元字符來搜索出TNT (1 stick)和TNT (5 sticks)
SELECT prod_name
FROM products
WHERE prod_name REGEXP "\\([1-9] sticks?\\)";
解析:
- “\ \ (” 爲轉義 “(”
- [0-9] 是數字0~9
- s? 是匹配s或者不匹配s都行,這樣就能匹配到stick和sticks
再比如上面的”.000”匹配JetPack 1000和JetPack 2000.我們可以換種方式匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP "[[:digit:]]{4}";
注意:使用上面的字符類[:digit:]一律表達爲[xxx]格式,即在外面再加一個”[]”。否則匹配不到
定位符
使用^和$來定義文本的開頭和結尾。我們說,LIKE匹配的是整個字串,而REGEXP匹配的是子串。要想REGEXP匹配整個串的話就要用到^ 和$
比如,搜索以數字(包括小數)開頭的產品名,我們分別用LIKE和REGEXP來匹配
用LIKE只能曲線救國,一點也不直接
SELECT prod_name
FROM products
WHERE prod_name LIKE "%anvil%";
SELECT prod_name
FROM products
WHERE prod_name REGEXP "^[0-9\\.]";
解析:
- ^代表文本開頭,這樣才能匹配以數字(包括小數)開頭的文本
- [0-9\.] 表示0~9和“.”中任意字符
- ^在[]外面表開頭,在[]裏面表取反。比如上面的[^範李]來去掉範,李
使用SELECT和REGEXP來進行簡單測試
比如我想測試一個文本里是否含有數字
SELECT "hello" REGEXP "[0-9]";
含有就返回1,不包含就返回0.
上例返回數字0,因爲文本“hello”裏不包含數字。