MySQL正規表示式REGEXP使用詳解
正規表示式用來匹配文字的特殊的串(字元集合)(匹配文字,將一個模式(正規表示式)與一個文字串進行比較)。
LIKE 和 REGEXP之間的重要差別
LIKE 匹配整個列,如果被匹配的文字在列值中出現,LIKE 將不會找到它,相應的行也不會被返回(除非使用萬用字元)。而 REGEXP 在列值內進行匹配,如果被匹配的文字在列值中出現,REGEXP 將會找到它,相應的行將被返回,並且 REGEXP 能匹配整個列值(與 LIKE 相同的作用)。
正規表示式匹配不區分大小寫
MySQL 的正規表示式匹配(自3.23.4版本後)不區分大小寫(即大寫和小寫都匹配)。為區分大小寫,可以使用 BINARY 關鍵字,例如:WHHERE name REGEXP BINARY 'Hern .000'。
簡單的正規表示式測試
可以在不使用資料庫表的情況下用 SELECT 語句來測試正規表示式,REGEXP 檢查總是返回0(沒有匹配)或1(匹配)。可以用帶文字串的 REGEXP 來測試表示式,並試驗它們。
例如:檢測 'Hern' 中是否含有數位
SELECT 'Hern' REGEXP '[0-9]';
結果將返回0(因為 ‘Hern’ 中沒有數位)
空白元字元(特殊含義的字元)
用雙反斜槓(\)來參照元字元(具有特殊含義的字元)。常用參照元字元:
字元 | 其它資訊 |
---|---|
[ 和 ] | 左右方括號用於指定字元類。字元類是進行匹配時所要依據的一組字元。 除連字元 (-) 和脫字元 (^) 外,在字元類中指定的元字元和量詞(如 * 和 {m},分別為元字元和量詞)沒有特殊意義,可當作實際字元進行運算。 |
* | 星號可用於與字元匹配 0 次或多次。例如,REGEXP '.*abc' 匹配的字串以 abc 結尾並以任何字首開頭。因此,aabc、xyzabc 和 abc 匹配,但 bc 和 abcc 則不匹配。 |
? | 問號可用於與字元匹配 0 次或 1 次。例如,'colou?r' 匹配 color 和 colour。 |
+ | 加號可用於與字元匹配 1 次或多次。例如,'bre+' 匹配 bre 和 bree,但不匹配 br。 |
- | 可以在字元類中使用一個連字元來表示一個範圍。例如, |
% | 百分號可與 SIMILAR TO 配合使用來匹配任意數目的字元。 不將百分號視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字元。當指定時,它匹配百分號 (%)。 |
_(下劃線字元) | 可將下劃線與 SIMILAR TO 配合使用來匹配單個字元。 不將下劃線視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字元。當指定時,它匹配下劃線 (_)。 |
| | 管道符號用於指定匹配字串時要使用的替代模式。在由豎線分隔的一行模式中,豎線被解釋為 OR,匹配過程從最左側的模式開始,在找到第一個匹配項時停止。因此,您應按優先順序的降序順序列出模式。您可以指定任意數量的替代模式。 |
( 和 ) | 當左括號和右括號用於正規表示式的各個組合部分時,它們為元字元。例如,(ab)* 匹配零個或多個 ab 的重複項。與使用數學表示式一樣,您使用組合來控制正規表示式各部分的計算順序。 |
{ 和 } | 當左大括號和右大括號用於指定量詞時,它們為元字元。量詞指定一個模式要構成某個匹配所必須重複的次數。例如:
|
反斜線被用作元字元的跳脫字元。它也可被用於跳脫非元字元。 | |
^ | 匹配輸入字串的開始位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 也匹配 'n' 或 'r' 之後的位置。 |
$ | 匹配輸入字串的結束位置。如果設定了RegExp 物件的 Multiline 屬性,$ 也匹配 'n' 或 'r' 之前的位置。 |
. | 匹配除 "n" 之外的任何單個字元。要匹配包括 'n' 在內的任何字元,請使用象 '[.n]' 的模式。 |
: | 在字元集中使用冒號來指定子字元類。例如, |
注意:
1、多數正規表示式實現使用單個反斜槓跳脫特殊字元,一遍能使用這些字元本身,但是MySQL要求兩個反斜槓(MySQL自己解釋一個,正規表示式庫解釋另一個)。
2、^ 符號的雙重用途: ^在集合中(用 [ ] 定義)時用它來否定該集合,否則用來指定串的開始處。
匹配字元類
子字元類 | 其它資訊 |
---|---|
[:alpha:] | 匹配當前歸類中的大寫和小寫字母字元。例如,'[0-9]{3}[[:alpha:]]{2}' 匹配三個數位,後跟兩個字母。 |
[:alnum:] | 匹配當前歸類中的數位、大寫和小寫字母字元。例如,'[[:alnum:]]+' 匹配含有一個或多個字母和數位的字串。 |
[:digit:] | 匹配當前歸類中的數位。例如,'[[:digit:]-]+' 匹配含有一個或多個數位或橫線的字串。同樣,'[^[:digit:]-]+' 匹配含有一個或多個不是數位或橫線的字元的字串。 |
[:lower:] | 匹配當前歸類中的小寫字母字元。例如,'[[:lower:]]' 不匹配 A,因為 A 為大寫。 |
[:space:] | 匹配單個空格 (' ')。例如,搜尋 Contacts.City 以查詢任何名稱為兩個詞的城市: SELECT City FROM Contacts WHERE City REGEXP '.*[[:space:]].*'; |
[:upper:] | 匹配當前歸類中的大寫字母字元。例如, |
[:whitespace:] | 匹配一個空白字元,例如,空格、製表符、換頁符和回車符。 |
[:ascii:] | 匹配任何七位的 ASCII 字元(0 到 127 之間的順序值)。 |
[:blank:] | 匹配一個空白區或水平製表符。
|
[:cntrl:] | 匹配順序值小於 32 或字元值為 127 的 ASCII 字元(控制字元)。控制字元包括換行符、換頁符、退格符,等等。 |
[:graph:] | 匹配列印字元。
|
[:print:] | 匹配列印字元和空格。
|
[:punct:] | 匹配其中一個字元: !"#$%&'()*+,-./:;<=>?@[]^_`{|}~.
|
[:word:] | 匹配當前歸類中的字母、數位或下劃線字元。
|
[:xdigit:] | 匹配字元類 [0-9A-Fa-f] 中的字元。 |
正規表示式支援的其它語法約定
正規表示式語法 | 名稱和含義 |
---|---|