MySQL-正則表達式進行復雜匹配

我們先來看下商品名稱列

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”裏不包含數字。

這裏寫圖片描述

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