oracle中的正規表示式(regular expression)

fengzj發表於2008-11-11

oracle中的正規表示式(regular expression)
正規表示式是很多程式語言中都有的。可惜oracle8i、oracle9i中一直遲遲不肯加入,好在oracle10g中終於增加了期盼已久的正規表示式功能。你可以在oracle10g中使用正規表示式肆意地匹配你想匹配的任何字串了。

所謂正規表示式是對於字串進行匹配的一種模式。舉個例子來說字串’^198[0-9]$’可以匹配‘1980-1989’,也即80後出生的年份。如果希望統計出公司那些員工是80後的,就可以使用如下的SQL語句:
select * from emp where regexp_like(to_char(birthdate,’yyyy’),’^198[0-9]$’);

這裡用到了regexp_like和to_char函式。

這裡在正規表示式中用到的^、$、[0-9]都被稱為後設資料(metacharacter),正規表示式都是由多元表示式組成的。在這裡,^表示一個字串的開頭,$表示一個字元換的結尾,因此^198表示以198開頭的字串,而[0-9]$則表示以0-9的數字結尾的字串。因此整體上’^198[0-9]$’就能匹配所有1980-1989的字串。

正規表示式中常用到的後設資料(metacharacter)如下:

^  匹配字串的開頭位置。
$  匹配支付傳的結尾位置。
*  匹配該字元前面的一個字元0次,1次或者多次出現。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。
+ 匹配該字元前面的一個字元1次或者多次出現。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等
?  匹配該字元前面的一個字元0次或1次或者多次出現。例如52?oracle 只能匹配5oracle,52oracle等等
{n} 匹配一個字串n次,n為正整數。例如:hel{2}o 所匹配的是hello
{n,m} 匹配一個字串至少n次,至多m次。其中n和m都是整數。
.  匹配除了null之外的任何單個字串
(pattern) 這個是用來匹配指定模式的一個子表示式
x|y  匹配x或者y,其中x和y是一個或者多個字元
[abc] 匹配括號中的任意一個字元。例如:[ab]bc可以匹配abc和bbc
[a-z] 匹配指定範圍內的任意字串。例如[A-G]hi可以匹配Ahi至Ghi
[::]指定一個字元類,可以匹配該類中的任意字元 這裡的字元類包括:
[:alphanum:] 可以匹配字元0-9、A-Z、a-z
[:alpha:]可以匹配字元A-Z、a-z
[:blank:]可以匹配空格或者tab鍵
[:digit:]可以匹配數字 0-9
[:gragh:]可以匹配非空字元
[:punct:]可以匹配. , ” ‘等標點符號。
[:upper:]可以匹配字元A-Z
[:lower:]可以匹配字元a-z
這裡列出的是一些常見的正規表示式中的後設資料。更多的正規表示式
關於orace中的正規表示式只能通過oracle特意為正規表示式設計的4個函式來使用。這4個函式分別是:
regexp_like,regexp_instr,regexp_replace,regexp_substr。關於這4個函式的具體用法,會在稍後介紹,這裡簡單說一下:

regexp_like(x,pattern)當x能正確匹配字串時返回true。
regexp_instr(x,pattern)在x中嘗試匹配pattern,並返回匹配的位置。
regexp_replace(x,pattern,replacestring)在x中嘗試匹配pattern,並將其替換成replacestring。
regexp_substr(x,pattern)返回x中匹配pattern的一個字串。
關於這幾個函式的具體用法會稍後詳細介紹。

oracle中正規表示式相關函式regexp_like簡介
前面介紹了oracle中正規表示式構成的後設資料,但僅僅知道後設資料是不夠的,oracle中的正規表示式是結合其特定的4個函式使用的,其中用的最多的就是現在要介紹的的這個函式:regexp_like

regexp_like函式的基本構成是:
regexp_like(x,pattern[,match_option])
其基本功能是在x中查詢pattern,如果能找到返回true否則返回false,這裡的可選引數match_option可以有如下幾種形式:

‘c’ 表明進行匹配時區分大小寫(這也是預設選項)。
‘i’  表明在匹配時不區分大小寫。
‘n’ 表明允許使用匹配任何字串的後設資料,即’.'。
‘m’將x作為一個包含多行的字串。
以下是兩個關於regexp_like的例子:
這個例子是尋找員工中的80後的員工。
select * from emp where regexp_like(to_char(birthdate,’yyyy’),’^198[0-9]$’);
這個例子是尋找名字是以’M'或者’m'打頭的那些員工的名字
select * from emp where regexp_like(ename,’^j’,'i’)

oracle中的正規表示式函式regexp_instr
前面我們介紹了oracle中的正規表示式組常用的一個函式regexp_like,這裡我們在介紹一個函式regexp_instr。這個正規表示式函式用的不如前一個多,但也會偶爾會用到。這個函式其實與我們前面曾介紹的instr函式其實相似。

regexp_instr的原型如下:
regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])
這裡每個引數分別含義如下:

x  待匹配的字串
pattern 待匹配的模式
start   開始匹配的位置,如果不指定預設為1
occurrence  匹配的次數,如果不指定,預設為1
return_option  指定返回值的型別,如果該引數為0,則返回值為匹配位置的第一個字元,如果該值為非0則返回匹配值的最後一個位置。
match_option 可以用這個引數來修改一些預設的配置設定。這個值與前面所說的regexp_like函式中的match_option引數的意義是一樣的。
下面來舉幾個有關regexp_instr函式的例子:
select (’i love
www.52oracle.com’,'o[[:alpha:]]{4}e$’,1,1) as r from dual
這個例子從’i love
www.52oracle.com’這個字串中匹配一個模式,這個模式是以o開頭,以e結尾,在o和e之間有4個字元的字串。這樣自然而然就返回oracle的起始位置14

另一個例子是:
select (’i love
www.52oracle.com’,'o[[:alpha:]]{2}’,1,2,1) as r from dual
這個例子的含義是在’i love
www.52oracle.com’這個字串中匹配另一個模式,這個模式是以o開始,再包含兩個字元的一個模式,因此這個模式可以是ove,也可是ora但是我們要求它匹配兩次,因此這個SQL語句的結果是ora所在的位置,所在的什麼位置呢?因為我們的return_option引數的值是1,即大於0,所以這的結果是16,也就單詞oracle中a所在的位置。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219982/viewspace-490823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章