正則表達式是用來匹配文本的特殊的串(字符集合),將一個模式(正則表達式)與一個文本串進行比較;
所有種類的程序設計語言、文本編輯器、操作系統等都支持正則表達式,正則表達式用正則表達式語言來建立;
MySQL僅支持多數正則表達式實現的一個很小的子集;
一、基本字符匹配
select column from table where column regexp ‘1000’ order by column;
該語句檢索列column包含文本1000的所有行;它告訴MySQL:regexp后所跟的東西作為正則表達式(與文字正文1000匹配的一個正則表達式)處理。
select column from table where column regexp ‘.000’ order by column;
該語句中的正則表達式(.),是正則表達式語言中的一個特殊字符,表示匹配任意一個字符(該語句也可以使用like和通配符完成)
like和regexp的區別:
①like匹配整個列;
select column from table where column like ‘1000’ order by column;
該SQL語句將不返回數據,因為like匹配整個列,如果被匹配的文本在列值中出現,like將不會找到它,相應的行也不會被返回(除非使用通配符)
②regexp在列值內進行匹配
select column from table where column regexp ‘1000’ order by column;
該SQL語句會返回一行數據,如果被匹配的文本在列值中出現,regexp將會找到它,相應的行將被返回(如果希望regexp匹配整個列值,使用^和$定位符{anchor})即可
MySQL中正則表達式匹配不區分大小寫,如希望區分大小寫,可使用binary關鍵字,如where column regexp binary ‘test .000’
二、進行or匹配
select column from table where column regexp ‘X|Y’ order by column;
or表示匹配其中之一,功能雷雨與select語句中的or語句,多個or條件可並入單個正則表達式
三、匹配幾個字符之一
select column from table where column regexp ‘[XYZ]test’ order by column;
[]是另一種形式的or語句,作用是匹配指定的(其中之一)字符;正則表達式[XY]test為[X|Y|Z]test的縮寫,它的意思是匹配X或者Y或者Z
字符集合也可以被否定,即匹配除指定字符外的任何東西,為否定一個字符集,可以在集合開始處設置一個‘^’例如[^XYZ]([]定義更准確,|如果不括起來,則應用於整個串)
四、匹配范圍
集合可以用來定義要匹配的一個或多個字符
比如[0123456789],為了簡化這種類型的集合,可使用(-)來定義一個范圍,即[0-9];(范圍不僅僅局限於數值,還可以使字母字符等)
五、匹配特殊字符
正則表達式由具有特定含義的特殊字符構成;如果要匹配這些特殊字符,就需要用\\為前導;\\-表示查找-,\\.表示查找.
select column from table where column regexp ‘\\-’ order by column;
這種處理方式就是所謂的轉義(escaping),正則表達式內具有特殊意義的所有字符都必須以這種方式轉義;(為了匹配反斜杠{\}字符本身,需要使用\\\)
PS:多數正則表達式實現使用單個反斜杠轉義特殊字符,以便能夠使用這些字符本身,而MySQL要求兩個反斜杠(MySQL自己解釋一個,正則表達式庫解釋一個)
\\也用來引用元字符(具有特殊含義的字符),如下:
六、匹配字符類
字符類(character class):有時候需要檢索出我們需要的數字、所有字母字符或所有數字字母字符等的匹配,我們可以使用預定義的字符集,稱為字符類;如下:
七、匹配多個實例
有時候需要對匹配的數目進行更強的控制,比如:尋找所有的數,不管數中包含多少數字,或尋找一個單詞並尾隨一個s(如果存在)等情況,我們可以利用正則表達式中的重復元字符來完成;如下
select column from table where column regexp ‘\\([0-9] sticks?\\)’ order by column;
上面的正則表達式‘\\([0-9] test?\\)’意為:\\匹配([0-9]匹配任意數字,這里指匹配的數值范圍,sticks?匹配stick和sticks{?使s可選,因為?匹配它前面任何字符的0或者1次出現})
八、定位符
有時候為了匹配特定位置的文本,需要使用定位符,常用定位符列表如下:
例如:找出一個以一個數(包括小數點開始的數)開始的所有數值,簡單搜索[0-9\\.]或([[:digit:]\\.])不行,因為它將在文本內任意位置查找匹配,可以使用^定位符,如下
select column from table where column regexp '^[0-9\\.]' order by column;
^匹配串的開始,有兩種用法:
①在集合中(用[和]定義),用它來否定該集合
②用來指串的開始處
使regexp和like起相同作用:like匹配整串二regexp匹配子串,可以利用定位符,用^開始每個表達式,用$結束每個表達式,就可以使regexp和like作用一樣