1. 程式人生 > >萬用字元和正則表示式

萬用字元和正則表示式

萬用字元過濾

1.like操作符

2.百分號萬用字元(%)

在搜尋串中,%表示任何字元出現的任意次數。%不能匹配null,如like ‘jet%’表示以jet開頭的後面不管多少字元的匹配。

如果區分大小寫查詢,使用binary:

select * from `test` where binary `name` = "Test"

3.下劃線萬用字元(_)

下劃線只匹配單個字元而不是多個字元,like ‘_ton’

使用萬用字元會使查詢變慢。

正則表示式

1.基本字元匹配

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’

2.進行or匹配

 select column from table where column regexp 'X|Y' order by column;

or表示匹配其中之一,功能雷雨與select語句中的or語句,多個or條件可併入單個正則表示式

3.匹配幾個字元之一

 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];(範圍不僅僅侷限於數值,還可以使字母字元等)

4、匹配特殊字元

正則表示式由具有特定含義的特殊字元構成;如果要匹配這些特殊字元,就需要用\為前導;\-表示查詢-,\.表示查詢.

select column from table where column regexp ‘\-’ order by column;

這種處理方式就是所謂的轉義(escaping),正則表示式內具有特殊意義的所有字元都必須以這種方式轉義;(為了匹配反斜槓{}字元本身,需要使用\\)

PS:多數正則表示式實現使用單個反斜槓轉義特殊字元,以便能夠使用這些字元本身,而MySQL要求兩個反斜槓(MySQL自己解釋一個,正則表示式庫解釋一個)

\也用來引用元字元(具有特殊含義的字元),如下:

img

5、匹配字元類

**字元類(character class):**有時候需要檢索出我們需要的數字、所有字母字元或所有數字字母字元等的匹配,我們可以使用預定義的字符集,稱為字元類;如下:

img

6、匹配多個例項

有時候需要對匹配的數目進行更強的控制,比如:尋找所有的數,不管數中包含多少數字,或尋找一個單詞並尾隨一個s(如果存在)等情況,我們可以利用正則表示式中的重複元字元來完成;如下

img

select column from table where column regexp ‘\([0-9] sticks?\)’ order by column;

上面的正則表示式‘\([0-9] test?\)’意為:\匹配([0-9]匹配任意數字,這裡指匹配的數值範圍,sticks?匹配stick和sticks{?使s可選,因為?匹配它前面任何字元的0或者1次出現})

7、定位符

有時候為了匹配特定位置的文字,需要使用定位符,常用定位符列表如下:

img

例如:找出一個以一個數(包括小數點開始的數)開始的所有數值,簡單搜尋[0-9\.]或([[:digit:]\.])不行,因為它將在文字內任意位置查詢匹配,可以使用^定位符,如下

select column from table where column regexp ‘1’ order by column;

^匹配串的開始,有兩種用法:

在集合中(用[和]定義),用它來否定該集合

用來指串的開始處

**使regexp和like起相同作用:**like匹配整串二regexp匹配子串,可以利用定位符,用^開始每個表示式,用$結束每個表示式,就可以使regexp和like作用一樣

  1. 0-9\. ↩︎