SQL中的正則表達式

當咱們要進行一些簡單的糊塗查詢時用百分號(%),通配符(_)就能夠了.其中%表達任意長度的字符串,_表示任意的某一個字符.git

好比select * from emp where ename like 's%' or ename like 's_';web

但若是在一些複雜的查詢中關用這兩個符號sql語句就會很是複雜,並且也不必定能實現.從Oracle 10g開始引入了在其餘程序語言中普通使用的正則表達式.正則表達式

主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數.sql

正則表達式中的元字符:

元字符函數

意思spa

例子

    \regexp

說明要匹配的字符是一個特殊字符、常量或者後者引用。(後引用重複上一次的匹配)orm

\n 匹配換行符
\\ 匹配 \
\( 匹配 (
\) 匹配 )
^ 匹配字符串的開頭位置 ^a匹配arwen.但不匹配barwen.

     $ci

匹配字符串的末尾位置 en$匹配arwen.但不匹配arwenb.

      *字符串

匹配前面的字符0次或屢次 a*rwen能夠匹配rwen或aaarwen.
+ 匹配前面的字符1次或屢次 a+rwen能夠匹配arwen或aarwen.但不能匹配rwen.
? 匹配前面的字符0次或1次 a?rwen能夠匹配arwen或rwen.但不能匹配aarwen.
{n} 匹配前面的字符剛好是n次,其中n是整數 ar{2}wen能夠匹配arrwen.但不能匹配arwen或arrrwen.
{n,m}

匹配前面的字符至少是n次,最可能是m次.若是寫成

{n,}表示最少匹配n次.沒有上限.

ar{1,2}wen能夠匹配arwen,arrwen.但不匹配awen或arrrwen.
. 點號,匹配除null,換行之外的任意單個字符 arw.n.能夠匹配arwen,arwin.但不能匹配arween或arwn.
(pattern) 括號中pattern是一個子正則表達式,匹配指定pattern模式的一個子表達式。 其實括號就像通常語言表達式中的括號.有時多加些括號可加強可讀性.另外的用處見下面關於\n的描述.
x|y 匹配「或」 x|y能夠匹配x或者y
[abc] 能夠匹配abc中的任何單個字符 hello[abc]能夠匹配helloa,hellob,helloc
[a-z] 能夠匹配指定範圍內的任何單個字符 hell[a-z]能夠匹配hello或者hellz
[::] 指定一個字符類,能夠匹配該類中的任何字符 [:alphanum:]能夠匹配字符0-九、A-Z、a-z
[:alpha:]能夠匹配字符A-Z、a-z
[:blank:]能夠匹配空格或tab鍵
[:digit:]能夠匹配數字0-9
[:graph:]能夠匹配非空字符
[:lower:]能夠匹配小寫字母a-z
[:print:]與[:graph:]相似,不一樣之處在於[:print:]包括空格字符
[:punct:]能夠匹配標點符號.,""等等
[:space:]能夠匹配全部的空字符
[:upper:]能夠匹配大寫字母A-Z
[:xdigit:]能夠匹配十六進制數字0-九、A-F、a-f
\n 這是對前一次匹配命中的一個後引用,其中n是一個正整數 arw(en)\1能夠匹配arwenen.注意\1前面必須是個加括號的子表達式.

1.regexp_like:

regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還能夠提供一個可選的參數match_option字符串說明默認的匹配選項。match_option的取值以下:
‘c’   說明在進行匹配時區分大小寫(缺省值);
 'i'   說明在進行匹配時不區分大小寫;
 'n'   (.)點號能表示全部單個字符,包括換行(俺還不知道什麼地方有用到換行.只知道sql裏面能夠用chr(10)表示換行.
 'm'   字符串存在換行的時候看成多行處理.這樣$就可匹配每行的結尾.否則的話$只匹配字符串最後的位置.

示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');能夠查找ename中以a開頭以n結尾的行.例如ename爲arwen或arwin或anden.但Arwen不能被匹配.由於默認是區分大小寫.若是是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則能夠查找ename爲Arwen的行記錄.

 

2.regexp_instr:

REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。能夠參考字符串函數 INSTR(),參數相關:
    'start'   開始查找的位置;
    'occurrence'   說明應該返回第幾回出現pattern的位置;
    'return_option'   說明應該返回什麼整數。若該參數爲0,則說明要返回的整數是x中的一個字符的位置;若該參數爲非0的整數,則說明要返回的整數爲x中出如今pattern以後   的字符的位置;
    'match_option'   修改默認的匹配設置.與regexp_like裏面的相同.

示例:

DECLARE     

V_RESULT INTEGER ;    

BEGIN     

  SELECT  REGEXP_INSTR('hello world','o',1,1,0) INTO  V_RESULT    

FROM  DUAL;    

 DBMS_OUTPUT.PUT_LINE(V_RESULT); 

END;

結果爲5.即字母o第一個次出現的位置

若是regexp_instr('hello world','o',1,1,n)其中n爲除0以外的整數.好比1,3.則結果爲6.表示第一次出現字母o的後面一個字符的位置.

若是regexp_instr('hello world','o',1,2,0)則結果爲9.表示第二次出現字母o的位置.

3.regexp_replace:

REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查找pattern,並將其替換爲replae_string。能夠參考字符串函數 REPLACE(),參數同REGEXP_INSTR函數

示例:

DECLARE     

V_RESULT varchar2(90);    

BEGIN     

  SELECT  REGEXP_REPLACE('hello world','o','x',1,1) INTO  V_RESULT    

FROM  DUAL;    

DBMS_OUTPUT.PUT_LINE(V_RESULT); 

END;

結果爲hellx world.

若是REGEXP_REPLACE('hello world','o','x'),則結果爲hellx wxrld.

若是 REGEXP_REPLACE('hello world','o','x',1,2)則結果爲hello wxrld.

4.regexp_substr:

REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用於在x中查找pattern並返回。能夠參考字符串函數 SUBSTR(),參數同REGEXP_INSTR函數.

例如:

DECLARE        

 V_RESULT VARCHAR2(255);      

BEGIN       

  SELECT  REGEXP_SUBSTR('hello world','l{2}') INTO  V_RESULT       

   FROM  DUAL;             

 DBMS_OUTPUT.PUT_LINE(V_RESULT);           

END ; 

結果爲ll

查詢到匹配的字符串才返回匹配的字符.沒查到就返回空.

相關文章
相關標籤/搜索