SQL的查詢語句中,有時會需要引進正規表達式為其複雜搜尋指定模式。下面給出一些Regexp在MYSQL語句中應用(非全部):
<b>1) ^</b> 比對字元串的開始部分。
<b>2) $</b> 比對字元串的結束部分。
<b>3) .</b> 比對任何字元(包括回車和新行)。
<b>4) [:character_class:]</b> 在括号表達式中(使用[和]),[:character_class:]表示與術語類的所有字元比對的字元類。标準的類名稱是:
alnum 文字數字字元 alpha 文字字元 blank 空白字元 cntrl 控制字元 digit 數字字元 graph 圖形字元 lower 小寫文字字元 print 圖形或空格字元 punct 标點字元 space 空格、制表符、新行、和回車 upper 大寫文字字元 xdigit 十六進制數字字元 它們代表在ctype(3)手冊頁面中定義的字元類。特定地區可能會提供其他類名。字元類不得用作範圍的端點。 mysql> <b>SELECT 'justalnums' REGEXP '[[:alnum:]]+';</b> -> 1 mysql> <b>SELECT '!!' REGEXP '[[:alnum:]]+';</b> -> 0 <b>5) [[:<:]], [[:>:]]</b> 這些标記表示word邊界。它們分别與word的開始和結束比對。word是一系列字字元,其前面和後面均沒有字字元。字字元是alnum類中的字母數字字元或下劃線(_)。
要想在正規表達式中使用特殊字元的文字執行個體,應在其前面加上2個反斜杠“/”字元。MySQL解析程式負責解釋其中一個,正規表達式庫負責解釋另一個。例如,要想與包含特殊字元“+”的字元串“1+2”比對,在下面的正規表達式中,隻有最後一個是正确的:
字元 含意 / 做為轉意,即通常在"/"後面的字元不按原來意義解釋,如/b/比對字元"b",當b前面加了反斜杆後//b/,轉意為比對一個單詞的邊界。 -或- 對正規表達式功能字元的還原,如"*"比對它前面元字元0次或多次,/a*/将比對a,aa,aaa,加了"/"後,/a/*/将隻比對"a*"。 ^ 比對一個輸入或一行的開頭,/^a/比對"an A",而不比對"An a" $ 比對一個輸入或一行的結尾,/a$/比對"An a",而不比對"an A" * 比對前面元字元0次或多次,/ba*/将比對b,ba,baa,baaa + 比對前面元字元1次或多次,/ba*/将比對ba,baa,baaa ? 比對前面元字元0次或1次,/ba*/将比對b,ba (x) 比對x儲存x在名為$1...$9的變量中 x|y 比對x或y {n} 精确比對n次 {n,} 比對n次以上 {n,m} 比對n-m次 [xyz] 字元集(character set),比對這個集合中的任一一個字元(或元字元) [^xyz] 不比對這個集合中的任何一個字元 [/b] 比對一個倒退符 /b 比對一個單詞的邊界 /B 比對一個單詞的非邊界 /cX 這兒,X是一個控制符,//cM/比對Ctrl-M /d 比對一個字數字元,//d/ = /[0-9]/ /D 比對一個非字數字元,//D/ = /[^0-9]/ /n 比對一個換行符 /r 比對一個回車符 /s 比對一個空白字元,包括/n,/r,/f,/t,/v等 /S 比對一個非空白字元,等于/[^/n/f/r/t/v]/ /t 比對一個制表符 /v 比對一個重直制表符 /w 比對一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括下劃線,如[/w]比對"$5.98"中的5,等于[a-zA-Z0-9] /W 比對一個不可以組成單詞的字元,如[/W]比對"$5.98"中的$,等于[^a-zA-Z0-9]。
附:
preg,代表“Perl的正規表達式(Perl Regular Expressions)”。 ereg,代表“擴充的正規表達式(Extended Regular Expressions)”。 這兩組函數的主要差別有: 1.preg_replace()裡面的正則可以寫成型如:"/..../"而ereg_replace()裡面的正則需寫成型如"....."; 2.在逆向引用用preg_replace()可使用0-99個,而ereg_replace()最多為9個 3.preg_replace()能操作數組,而ereg_replace()不可以 4.ereg預設使用貪婪模式,并且不能修改 5.preg 的速度比 ereg 要快很多