MySQL必知必會》正規表示式

凌丹妙藥發表於2020-08-23

《MySQL必知必會》正規表示式

正規表示式

1.1、關鍵字 REGEXP

正規表示式的使用需要用到關鍵字 REGEXP

select prod_name
from products
where prod_name regexp '1000';

image-20200822211126660

從效果看和關鍵字 LIKE 有相似之處。但只從這個例子中看不出差別,而且使用正規表示式還會降低效能。

但是如果用 LIKE 替換上面的句子,是查詢不到資料的。

因為 LIKE 是匹配整個列內的全文字才會返回資料,要想做到和 REGEXP 一樣的效果,要使用萬用字元或者拼接函式才行。


正規表示式是需要配合起來使用才能看到它的擴充套件性。

select prod_name
from products
where prod_name regexp '.000';

image-20200822210806178

. 在正規表示式中表示任意一個字元。

以上例子使用的是數字匹配,要知道 MySQL 3.23.4+ 正規表示式匹配都是不區分大小寫的。

1.2、OR 匹配 ‘ | ’

select prod_name
from products
where prod_name regexp 'ton|1000|2000';

image-20200822212051907

使用 | 可以起到 or 的作用,要注意,不要有多餘的空格,將會影響匹配。可以給出兩個或兩個以上的條件。

1.3、匹配幾個字元之一

select prod_name
from products
where prod_name regexp '[125] ton';

image-20200822212503011

用 [ ] 定義一組字元,以上的例子表示匹配 1 2 5 三個字元。注意 ton 前是有一個空格的。匹配的是 ‘1 ton' , '2 ton' ,'5 ton' 這三個字串。

還有一種寫法,是使用 |

select prod_name
from products
where prod_name regexp '[1|2|5] ton';

得到的結果是和上面的一樣的。

但是要注意,下面這樣寫是得不到預期結果的。

select prod_name
from products
where prod_name regexp '1|2|5 ton';

image-20200822213311682

因為上面寫法告訴 MySQL ,將匹配 1 , 2 ,5 ton 單個字串

此外,還可以使用 ^ 來匹配這些字元以外的列。

select prod_name
from products
where prod_name regexp '[^123]';

image-20200822213614258

^ 當然也是不能匹配 NULL 值的列的。

1.4、匹配範圍

select prod_name
from products
where prod_name regexp '[1-5] ton';

image-20200822214049875

' - ' 表示範圍,1-5,表示1、2、3、4、5 。

a-z 表示任意字母範圍。

1.5、特殊字元

上面提到 . 表示任意一個字元,那麼如果需要匹配 '.' 要怎麼才能讓MySQL知道不去轉義它?

答案是 反斜杆 \ 。

select prod_name
from products
where prod_name regexp '\\.';

image-20200822215703347

還可以引用元字元:

元字元 說明
\\f 換頁
\\n 換行
\\r 回車
\\t 製表
\\v 縱向製表

匹配 \ 需要 \\\ 來表示。

1.6、匹配字元類

image-20200822220359075

1.7、匹配多個例項

select prod_name
from products
where prod_name regexp '\\([1-5] sticks?\\)';

image-20200823120856066

\\( :匹配 ( ;\\) :匹配 )

[1-5] : 匹配數字 1 -5 的範圍;

sticks? :需要拆分為 stick 和 s? 來看待,stick :匹配全文

s? : 表示 ? 前面的 s 為匹配0或1個,即為可選。

重複元字元說明如下表:

image-20200823121356180

結合上表匹配字元類的元字元,還可以

select prod_name
from products
where prod_name regexp '[[:digit:]]{4}';

image-20200822210806178

[:digit:] :表示匹配任意數字 ,{4} : 表示出現四次。

當然還可以有其他寫法,如下:

select prod_name
from products
where prod_name regexp '[0-9][0-9][0-9][0-9]';

1.8、定位符

定位元字元說明如下:

image-20200823122116098

想找以任意數字作為開頭的產品名:

select prod_name
from products
where prod_name regexp '^[1-9]';

image-20200823122359073

想找以任意數字作為結尾的產品名:

select prod_name
from products
where prod_name regexp '[0-9]$';

image-20200822210806178

注意 ^ 的兩種用法

用在[ ] 內表示否定該集合,用在 [ ] 外表示文字的開始處。

相關文章