mysql正則 非字串 mysql正規表示式

2021-10-18 11:20:07 字數 4250 閱讀 2627

正規表示式是為複雜搜尋指定模式的強大方式。

mysql採用henry spencer的正規表示式實施,其目標是符合posix 1003.2。

歸納了在mysql中可用於regexp操作的特殊字元和結構,並給出了一些示例。本附錄未包含可在henry spencer的regex(7)手冊頁面中發現的所有細節。該手冊頁面包含在mysql原始碼分發版中,位於regex目錄下的regex.7檔案中。

正規表示式描述了一組字串。最簡單的正規表示式是不含任何特殊字元的正規表示式。例如,正規表示式hello匹配hello。

非平凡的正規表示式採用了特殊的特定結構,從而使得它們能夠與1個以上的字串匹配。例如,正規表示式hello|word匹配字串hello或字串word。

作為乙個更為複雜的示例,正規表示式b[an]*s匹配下述字串中的任何乙個:bananas,baaaaas,bs,以及以b開始、以s結束、並在其中包含任意數目a或n字元的任何其他字串。

對於regexp操作符,正規表示式可以使用任何下述特殊字元和結構:

匹配字串的開始部分。

mysql> select 'fo\nfo' regexp '^fo$'; ->0

mysql> select 'fofo' regexp '^fo'; -> 1

匹配字串的結束部分。

mysql> select 'fo\no' regexp '^fo\no$'; -> 1mysql> select 'fo\no' regexp '^fo$'; -> 0

匹配任何字元(包括回車和新行)。

mysql> select 'fofo' regexp '^f.*$'; -> 1mysql> select 'fo\r\nfo' regexp '^f.*$'; -> 1

·         a*

匹配0或多個a字元的任何序列。

mysql> select 'ban' regexp '^ba*n'; -> 1mysql> select 'baaan' regexp '^ba*n'; -> 1mysql> select 'bn' regexp '^ba*n'; -> 1

·         a+

匹配1個或多個a字元的任何序列。

mysql> select 'ban' regexp '^ba+n'; -> 1mysql> select 'bn' regexp '^ba+n'; -> 0

·         a?

匹配0個或1個a字元。

mysql> select 'bn' regexp '^ba?n'; -> 1mysql> select 'ban' regexp '^ba?n'; -> 1mysql> select 'baan' regexp '^ba?n'; -> 0

·         de|abc

匹配序列de或abc。

mysql> select 'pi' regexp 'pi|apa'; -> 1mysql> select 'axe' regexp 'pi|apa'; ->0

mysql> select 'apa' regexp 'pi|apa'; -> 1mysql> select 'apa' regexp '^(pi|apa)$'; -> 1mysql> select 'pi' regexp '^(pi|apa)$'; -> 1mysql> select 'pix' regexp '^(pi|apa)$'; -> 0

·         (abc)*

匹配序列abc的0個或多個例項。

mysql> select 'pi' regexp '^(pi)*$'; -> 1mysql> select 'pip' regexp '^(pi)*$'; ->0

mysql> select 'pipi' regexp '^(pi)*$'; -> 1

·         ,

或符號提供了編寫正規表示式的更通用方式,能夠匹配模式的很多前述原子(或「部分」)。m和n均為整數。

o        a*

可被寫入為a。

o        a+

可被寫入為a。

o        a?

可被寫入為a。

更準確地講,a與a的n個例項準確匹配。a匹配a的n個或更多例項。a匹配a的m~n個例項,包含m和n。

m和n必須位於0~re_dup_max(預設為255)的範圍內,包含0和re_dup_max。如果同時給定了m和n,m必須小於或等於n。

mysql> select 'abcde' regexp 'a[bcd]e'; ->0

mysql> select 'abcde' regexp 'a[bcd]e'; -> 1mysql> select 'abcde' regexp 'a[bcd]e'; -> 1

·         [a-dx], [^a-dx]

匹配任何是(或不是,如果使用^的話)a、b、c、d或x的字元。兩個其他字元之間的「-」字元構成乙個範圍,與從第1個字元開始到第2個字元之間的所有字元匹配。例如,[0-9]匹配任何十進位制數字 。要想包含文字字元「]」,它必須緊跟在開括號「[」之後。要想包含文字字元「-」,它必須首先或最後寫入。對於對內未定義任何特殊含義的任何字元,僅與其本身匹配。

mysql> select 'axbc' regexp '[a-dxyz]'; -> 1mysql> select 'axbc' regexp '^[a-dxyz]$'; ->0

mysql> select 'axbc' regexp '^[a-dxyz]+$'; -> 1mysql> select 'axbc' regexp '^[^a-dxyz]+$'; ->0

mysql> select 'gheis' regexp '^[^a-dxyz]+$'; -> 1mysql> select 'gheisa' regexp '^[^a-dxyz]+$'; -> 0

·         [.characters.]

在括號表示式中(使用[和]),匹配用於校對元素的字串行。字元為單個字元或諸如新行等字元名。在檔案regexp/cname.h中,可找到字元名稱的完整列表。

mysql> select '~' regexp '[[.~.]]'; -> 1mysql> select '~' regexp '[[.tilde.]]'; -> 1

·         [=character_class=]

在括號表示式中(使用[和]),[=character_class=]表示等同類。它與具有相同校對值的所有字元匹配,包括它本身,例如,如果o和(+)均是等同類的成員,那麼[[=o=]]、[[=(+)=]]和[o(+)]是同義詞。等同類不得用作範圍的端點。

·         [:character_class:]

在括號表示式中(使用[和]),[:character_class:]表示與術語類的所有字元匹配的字元類。標準的類名稱是:

alnum

文字數字字元

alpha

文字字元

blank

空白字元

cntrl

控制字元

digit

數字字元

graph

圖形字元

lower

小寫文字字元

print

圖形或空格字元

punct

標點字元

space

空格、製表符、新行、和回車

upper

大寫文字字元

xdigit

十六進製制數字字元

它們代表在ctype(3)手冊頁面中定義的字元類。特定地區可能會提供其他類名。字元類不得用作範圍的端點。

mysql> select 'justalnums' regexp '[[:alnum:]]+'; -> 1mysql> select '!!' regexp '[[:alnum:]]+'; -> 0

這些標記表示word邊界。它們分別與word的開始和結束匹配。word是一系列字字元,其前面和後面均沒有字字元。字字元是alnum類中的字母數字字元或下劃線(_)。

mysql> select 'a word a' regexp '[[:<:>:]]'; -> 1mysql> select 'a xword a' regexp '[[:<:>:]]'; -> 0

要想在正規表示式中使用特殊字元的文字例項,應在其前面加上2個反斜槓「\」字元。mysql解析程式負責解釋其中乙個,正規表示式庫負責解釋另乙個。例如,要想與包含特殊字元「+」的字串「1+2」匹配,在下面的正規表示式中,只有最後乙個是正確的:

mysql> select '1+2' regexp '1+2'; ->0

mysql> select '1+2' regexp '1\+2'; ->0

mysql> select '1+2' regexp '1\\+2'; -> 1

mysql 字串正則匹配 mysql正規表示式

預備閱讀 mysql中用正規表示式進行搜尋1 使用mysql正規表示式 1 基本字串匹配 select prod name from products where prod name regexp 1000 order by prod name 檢索prod name包含文字1000的所有行。除關鍵...

字串 正則

var s hellow,world 定義乙個字串 s.charat 0 h,第乙個字元 s.charat s.length 1 d,最後乙個字串 s.substring 1,4 ell,第2 4個字元 s.slice 1,4 ell,同上 s.slice 3 rld,最後三個字元 s.indexo...

字串正則匹配

匹配1個或多個 匹配乙個 abc a b false abc a?c true abc a true ab a false 重點就是處理掉 如果匹配的時候 後面沒有字元了那返回真,如果有的話,那麼很簡單,從str中從後往前拿pattern 中 從 開始到pattern末尾個字元個數的字元,繼續遞迴匹...