MySQL正則表達式

DB version: 5.7.25-log 和 8.0.18

一、MySQL5.7中正則表達式

1.RLIKE() 為REGEXP同義詞,見下

2.REGEXP() 完整表達式 expr REGEXP pat
> 如果字符串expr與模式pat指定的正則表達式匹配,則返回1,否則返回0。
> 如果expr或pat為NULL,則返回值為NULL。
> 正則表達式規則明細及使用案例見下方。

3.NOT REGEXP() 完整表達式 expr NOT REGEXP pat 或者expr NOT RLIKE pat
NOT (expr REGEXP pat)相同。

正則表達式規則
^ 匹配字符串的開始
mysql> SELECT 'fo\nfo' REGEXP '^fo','ffo\nfo' REGEXP '^fo'; 
+-----------------------+------------------------+
| 'fo\nfo' REGEXP '^fo' | 'ffo\nfo' REGEXP '^fo' |
+-----------------------+------------------------+
|                     1 |                      0 |
+-----------------------+------------------------+
$ 匹配字符串的結尾
mysql> SELECT 'fo\nfoo' REGEXP 'fo$','ffo\nfo' REGEXP 'fo$'; 
+------------------------+------------------------+
| 'fo\nfoo' REGEXP 'fo$' | 'ffo\nfo' REGEXP 'fo$' |
+------------------------+------------------------+
|                      0 |                      1 |
+------------------------+------------------------+
. 匹配任何字符(包括回車和換行符)
mysql> SELECT 'fo\nfo' REGEXP 'fo.f','fo\nfo' REGEXP 'fo.o';
+------------------------+------------------------+
| 'fo\nfo' REGEXP 'fo.f' | 'fo\nfo' REGEXP 'fo.o' |
+------------------------+------------------------+
|                      1 |                      0 |
+------------------------+------------------------+
o* 匹配字符o出現0次或多次
mysql> SELECT 'fo\nfo' REGEXP 'fo*','fo\nfo' REGEXP 'fo*f','fo\nfo' REGEXP 'fo*o';
+-----------------------+------------------------+------------------------+
| 'fo\nfo' REGEXP 'fo*' | 'fo\nfo' REGEXP 'fo*f' | 'fo\nfo' REGEXP 'fo*o' |
+-----------------------+------------------------+------------------------+
|                     1 |                      0 |                      1 |
+-----------------------+------------------------+------------------------+
o+ 匹配字符o出現1次或多次
mysql> SELECT 'fo\nfo' REGEXP 'fo+','fo\nfo' REGEXP 'fo+f','fo\nfo' REGEXP 'fo+o';
+----------------------+------------------------+------------------------+
| 'fo\nfo' REGEXP 'fo+' | 'fo\nfo' REGEXP 'fo+f' | 'fo\nfo' REGEXP 'fo+o' |
+----------------------+------------------------+------------------------+
|                    1 |                      0 |                      0 |
+----------------------+------------------------+------------------------+
o? 匹配字符o出現0次或1次
mysql> SELECT 'fo\nfo' REGEXP 'fo?','fo\nfo' REGEXP 'fo?f','fo\nfo' REGEXP 'fo?o';
+-----------------------+------------------------+------------------------+
| 'fo\nfo' REGEXP 'fo?' | 'fo\nfo' REGEXP 'fo?f' | 'fo\nfo' REGEXP 'fo?o' |
+-----------------------+------------------------+------------------------+
|                     1 |                      0 |                      1 |
+-----------------------+------------------------+------------------------+
de|abc 匹配字符串 de 或者 abc,可結合上面的 ^ $ * + ? 等使用
mysql> SELECT 'finded' REGEXP 'de|abc','dest' REGEXP '^(de|abc)','dabcabc' REGEXP '(de|abc)?','rest' REGEXP 'de|abc';   
+--------------------------+---------------------------+------------------------------+------------------------+
| 'finded' REGEXP 'de|abc' | 'dest' REGEXP '^(de|abc)' | 'dabcabc' REGEXP '(de|abc)?' | 'rest' REGEXP 'de|abc' |
+--------------------------+---------------------------+------------------------------+------------------------+
|                        1 |                         1 |                            1 |                      0 |
+--------------------------+---------------------------+------------------------------+------------------------+
(abc)* 匹配字符串abc出現0次或多次,同上 o*
mysql> SELECT 'abcabc' REGEXP '(abc)*','abcab' REGEXP '(abc)*','e' REGEXP '(abcd)*'; 
+--------------------------+-------------------------+----------------------+
| 'abcabc' REGEXP '(abc)*' | 'abcab' REGEXP '(abc)*' | 'e' REGEXP '(abcd)*' |
+--------------------------+-------------------------+----------------------+
|                        1 |                       1 |                    1 |
+--------------------------+-------------------------+----------------------+
{1}, {2,3}   {n}和{m,n}符號提供了一種更通用的方式來編寫正則表達式,以匹配模式的前一個原子(或“塊”)的多次出現。m和n是整數,在0 到 255 之間,且 m <= n 。
如以下形式:
o*  可以被改寫 成 o{0,}
o+ 可以被改寫 成 o{1,}
o? 可以被改寫 成 o{0,1}

mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e' , 'abcde' REGEXP 'a[bcd]{3}e' ,'abbbe' REGEXP 'a[bcd]{3}e' , 'abcde' REGEXP 'a[bcd]{1,5}e','abcde' REGEXP 'a[bcd]{4,5}e' ; 
+-----------------------------+-----------------------------+-----------------------------+-------------------------------+-------------------------------+
| 'abcde' REGEXP 'a[bcd]{2}e' | 'abcde' REGEXP 'a[bcd]{3}e' | 'abbbe' REGEXP 'a[bcd]{3}e' | 'abcde' REGEXP 'a[bcd]{1,5}e' | 'abcde' REGEXP 'a[bcd]{4,5}e' |
+-----------------------------+-----------------------------+-----------------------------+-------------------------------+-------------------------------+
|                           0 |                           1 |                           1 |                             1 |                             0 |
+-----------------------------+-----------------------------+-----------------------------+-------------------------------+-------------------------------+
[abc]{3}  表示匹配 a、b、c三個字符任意一個或多個出現三次,如 aaa、aab、abc、ccc等均符合。
[bcd]{1,5} 表示匹配 a、b、c三個字符任意一個或多個出現1次到5次,如 a、ab、aaa、aab、abcc、aaaaa、bbccd等均符合。
[0-9X]     匹配0-9的數字或X;
[a-dX]     匹配a-d的所有字母(即 a,b,c,d)或X;
[^a-dX]    匹配非a-d、非X的字母。

mysql> SELECT  'aXbc' REGEXP '[a-dXYZ]','aXbc' REGEXP '^[a-dXYZ]$','aXbc' REGEXP '^[a-dXYZ]{4}$','aXbc' REGEXP '^[a-dXYZ]+$','aXbc' REGEXP '^[^a-dXYZ]+$','google' REGEXP '^[^a-dXYZ]+$' ; 
+--------------------------+----------------------------+-------------------------------+-----------------------------+------------------------------+--------------------------------+
| 'aXbc' REGEXP '[a-dXYZ]' | 'aXbc' REGEXP '^[a-dXYZ]$' | 'aXbc' REGEXP '^[a-dXYZ]{4}$' | 'aXbc' REGEXP '^[a-dXYZ]+$' | 'aXbc' REGEXP '^[^a-dXYZ]+$' | 'google' REGEXP '^[^a-dXYZ]+$' |
+--------------------------+----------------------------+-------------------------------+-----------------------------+------------------------------+--------------------------------+
|                        1 |                          0 |                             1 |                           1 |                            0 |                              1 |
+--------------------------+----------------------------+-------------------------------+-----------------------------+------------------------------+--------------------------------+
[.characters.]  在方括號表達式(使用 '[' 和 ']' 編寫)中,匹配該整理元素的字符序列。 字符可以是單個字符,也可以是字符名稱,例如newline。
附錄1 列出了允許的字符名稱。

mysql> SELECT '~' REGEXP '[[.~.]]','~' REGEXP '[[.tilde.]]';
+----------------------+--------------------------+
| '~' REGEXP '[[.~.]]' | '~' REGEXP '[[.tilde.]]' |
+----------------------+--------------------------+
|                    1 |                        1 |
+----------------------+--------------------------+
[=character_class=]  在方括號表達式(使用 '[' 和 ']' 編寫)中,[= character_class =]表示等價類。 
它匹配所有具有相同歸類值的字符,包括自身。 
例如,如果 o 和(+)是等價類的成員,則[[= o =]],[[=(+)=]]和[o(+)]都是同義詞。 
等效類不能用作范圍的末尾。
[:character_class:]  在方括號表達式(使用 '[' 和 ']' 編寫)中,[:character_class:]表示與屬于該類的所有字符匹配的字符類。 
附錄2 列出了允許的字符類名稱。

mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+' , '012345' REGEXP '[[:digit:]]+' , 'abc' REGEXP '[[:digit:]]+'; 
+------------------------------------+--------------------------------+-----------------------------+
| 'justalnums' REGEXP '[[:alnum:]]+' | '012345' REGEXP '[[:digit:]]+' | 'abc' REGEXP '[[:digit:]]+' |
+------------------------------------+--------------------------------+-----------------------------+
|                                  1 |                              1 |                           0 |
+------------------------------------+--------------------------------+-----------------------------+
[[:<:]], [[:>:]]   這些標記代表單詞邊界,它們分別匹配單詞的開頭和結尾。
mysql> SELECT 'asd  asd  word dasda ads ' REGEXP '[[:<:]]word[[:>:]]','我是 一句 完整的 話' REGEXP '[[:<:]]完整的[[:>:]]','我是 一句 完整的 話' REGEXP '[[:<:]]完整[[:>:]]'; 
+---------------------------------------------------------+-----------------------------------------------------+---------------------------------------------------+
| 'asd  asd  word dasda ads ' REGEXP '[[:<:]]word[[:>:]]' | '我是 一句 完整的 話' REGEXP '[[:<:]]完整的[[:>:]]' | '我是 一句 完整的 話' REGEXP '[[:<:]]完整[[:>:]]' |
+---------------------------------------------------------+-----------------------------------------------------+---------------------------------------------------+
|                                                       1 |                                                   1 |                                                 0 |
+---------------------------------------------------------+-----------------------------------------------------+---------------------------------------------------+
二、MySQL8 新增正則表達式

1.REGEXP_LIKE() REGEXP 和 RLIKE 是 REGEXP_LIKE() 的同義詞。
使用明細見上面5.7版本 '正則表達式規則'

2.REGEXP_INSTR() 完整表達式 REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
> 返回與模式 pat 指定的正則表達式匹配的字符串 expr 的子字符串的起始索引,如果沒有匹配則為0。
> 如果 expr 或 pat 為NULL,則返回值為NULL。字符索引從1開始。
完整表達式各參數含義:
pos: 從exprpos位置開始搜索,默認為1;
occurrence: 返回第occurrence個匹配的子字符串,默認為1;
return_option: 返回類型,如果為0,則返回匹配到的子字符串的第一個字符的位置,如果為1,則返回匹配到的子字符串最后一個字符的位置+1,默認為0;
match_type: 匹配類型,包含以下值,可同時使用一個或多個;
如果在match_type中指定了矛盾選項的字符,則以最右邊的字符為準。

c: 匹配時區分大小寫
i: 匹配時不區分大小寫
m: 多行模式。在字符串內識別行結束符。默認行為是只在字符串表達式的開始和結束處匹配行結束符。
n: 字符.匹配行結束,默認.匹配到行結尾停止。
u: 僅使用unix上的行結束符。只有換行符被識別為行結束,能夠被 . ^$ 匹配。
m n u 三個參數不知如何舉例。

mysql> SELECT REGEXP_INSTR('dog cat dog pig', 'dog'),REGEXP_INSTR('dog cat dog pig', 'dog',2,1,0),REGEXP_INSTR('dog cat dog pig', 'dog',2,1,1),REGEXP_INSTR('dog cat dog pig', 'Dog',2,1,1,'c'),REGEXP_INSTR('aa aaa aaaa', 'a{4}');
+----------------------------------------+----------------------------------------------+----------------------------------------------+--------------------------------------------------+-------------------------------------+
| REGEXP_INSTR('dog cat dog pig', 'dog') | REGEXP_INSTR('dog cat dog pig', 'dog',2,1,0) | REGEXP_INSTR('dog cat dog pig', 'dog',2,1,1) | REGEXP_INSTR('dog cat dog pig', 'Dog',2,1,1,'c') | REGEXP_INSTR('aa aaa aaaa', 'a{4}') |
+----------------------------------------+----------------------------------------------+----------------------------------------------+--------------------------------------------------+-------------------------------------+
|                                      1 |                                            9 |                                           12 |                                                0 |                                   8 |
+----------------------------------------+----------------------------------------------+----------------------------------------------+--------------------------------------------------+-------------------------------------+

3.REGEXP_REPLACE() 完整表達式 REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
> 用替換字符串repl替換字符串expr中與模式pat指定的正則表達式匹配的匹配項,并返回結果字符串。
> 如果expr,pat或repl為NULL,則返回值為NULL
pos,occurrence,match_type 參數含義見REGEXP_INSTR()

mysql>  SELECT REGEXP_REPLACE('a b c', 'b', 'X'),REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3), REGEXP_REPLACE('abc def ghi', 'def', 'X', 2,1);
+-----------------------------------+----------------------------------------------------+------------------------------------------------+
| REGEXP_REPLACE('a b c', 'b', 'X') | REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3) | REGEXP_REPLACE('abc def ghi', 'def', 'X', 2,1) |
+-----------------------------------+----------------------------------------------------+------------------------------------------------+
| a X c                             | abc def X                                          | abc X ghi                                      |
+-----------------------------------+----------------------------------------------------+------------------------------------------------+

4.REGEXP_SUBSTR() 完整表達式 REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
> 返回與模式pat指定的正則表達式匹配的字符串expr的子字符串;如果不匹配,則返回NULL。
> 如果expr或pat為NULL,則返回值為NULL。
pos,occurrence,match_type 參數含義見REGEXP_INSTR()


mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+'),REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3),REGEXP_SUBSTR('abc def ghi', '[a-z]+', 4, 2);
+----------------------------------------+----------------------------------------------+----------------------------------------------+
| REGEXP_SUBSTR('abc def ghi', '[a-z]+') | REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3) | REGEXP_SUBSTR('abc def ghi', '[a-z]+', 4, 2) |
+----------------------------------------+----------------------------------------------+----------------------------------------------+
| abc                                    | ghi                                          | ghi                                          |
+----------------------------------------+----------------------------------------------+----------------------------------------------+
附錄1:
附錄1.png
附錄2:
附錄2.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • 正則表達式的應用 前面的幾節的過濾例子允許用匹配、比較和通配操作符來尋找數據。對于基本的數據過濾,這樣就足夠了。但...
    IT的咸魚閱讀 459評論 0 0
  • 正則表達式用來匹配文本的特殊的串(字符集合)。正則表達式用正則表達式語言來建立,正則表達式語言是用來完成匹配特殊的...
    乘風破浪的姐姐閱讀 635評論 0 0
  • 我們知道MySQL可以通過 LIKE ...% 來進行模糊匹配。MySQL 同樣也支持其他正則表達式的匹配, My...
    _晴雨天閱讀 303評論 0 1
  • 用正則表達式進行搜索 1.正則表達式介紹 ? 對于基于的過濾(或者甚至是某些不那么基本的過濾),可以用匹配、比...
    JiangCheng97閱讀 1,032評論 0 1
  • 一.簡介 正則表達式的作用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL用where子句對正...
    尋找大海的魚閱讀 521評論 0 0