Oracle正則表達(dá)式的應(yīng)用在oracle里正則表達(dá)式有四個函數(shù)可用,分別是regexp_like、regexp_substr、regexp_instr 和regexp_replace。這里在我們oracle 10g里靈活應(yīng)用。 先來簡單介紹一下正則表達(dá)式的內(nèi)容,正則表達(dá)式是做為快速查詢的文本內(nèi)容的,在linux應(yīng)用比較多,首先,行的起始與結(jié)束 “^”這個字符是表示只查找行首的內(nèi)容。“$”這個字符只查找行末的內(nèi)容。接下來是“^”還可以做為一個排除字符來使用。還是使用例子來做一個演示比較明了一下。 這里我使用regexp_like這個函數(shù)來做,這樣可以我們平時會使用的比較多。select * from test_tablewhere regexp_like(field_1,'^1234')這個就是表示是以1234打頭的字符串是不是有匹配的。這里和like的方式是一樣的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')這里多了一個[]這里做一個獨立字符,這里表示是以1或2開始,并且接著是234這個里的字符就會是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(歐陽|李)小二')這里我們就可以表達(dá),這個查詢一個姓是歐陽或李的,名字叫小二的字符串。這里多了一個()這個是做一個為字符串的方式來寫的與[]剛好是對應(yīng)。這里還有一個“|”來表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')這里我們就可以查詢李小二或是李二,再或者是李小小二,都可以,這里我們需要講一下是[]后面帶了一個*,這個是表示0~無窮大 字符去匹配。這個[]我們還可以添加一個“+”來表示1~無窮大的字符去匹配,也可以更加精準(zhǔn)一些,在[]后面{1,3}這里就是表示1個到3個相同字符的匹配。還有一個“?”來說表示1或是0個。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')這里我們可以查詢到姓李的,但是第二字不是“小”這個字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')這里是表示我們查詢字符串含有0-9的數(shù)字的字符串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')這里是表示我們查詢字符串含有a-z的小寫字母的字符串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')這里是表示我們查詢字符串含有A-z的所有字母的字符串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')這里是表示查詢匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')這里是表示查詢匹配任意字母和數(shù)字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')這里是表示查詢匹配任意數(shù)字 Select * from test_tableWhere regexp_like(name,’of’,’i’)這里就是of不區(qū)分大小寫 Select * from test_tableWhere regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)這樣我們可以查詢是不是ip格式 接下來介紹一下regexp_substr這個也是一個非常實用的一個函數(shù) REGEXP_SUBSTR與SUBSTR函數(shù)相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 注: srcstr 源字符串 pattern 正則表達(dá)式樣式 position 開始匹配字符位置 occurrence 匹配出現(xiàn)次數(shù) match_option 匹配選項(區(qū)分大小寫) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual; Output: 1PSN [[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual; Output: 231 與上面一個例子相比,多了兩個參數(shù)1 表示從源字符串的第一個字符開始查找匹配2 表示第2次匹配到的字符串(默認(rèn)值是“1”,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual; Output: 231 @* 表示匹配0個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符注意:需要區(qū)別“+”和“*”的區(qū)別 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual; Output: @@+ 表示匹配1個或者多個@ [[:alnum:]]* 表示匹配0個或者多個字母或數(shù)字字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual; Output: Null @+ 表示匹配1個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual; Output: 125 [[:digit:]]+$ 表示匹配1個或者多個數(shù)字結(jié)尾的字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual; Output: Null @+ 表示匹配1個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual; Output: 125 [[:digit:]]+$ 表示匹配1個或者多個數(shù)字結(jié)尾的字符 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual; Output: /ABc [^[:digit:]]+$ 表示匹配1個或者多個不是數(shù)字結(jié)尾的字符 select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from dual; Output: Tom_Kyte [^@]+ 表示匹配1個或者多個不是“@”的字符 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from dual; Output: Null [[:alnum:]]* 表示匹配0個或者多個字母或者數(shù)字字符注:因為是匹配0個或者多個,所以這里第2次匹配的是“/”(匹配了0次),而不是“231”,所以結(jié)果是“Null” 這里我們有時候會查詢字符串里asdfafdmaindafda 這里我們要取出main這個字符串Select regexp_substr('asdfafdmaindafda','[^]+') from dualOutput: main 這里我們在中間去一個^這樣在匹配之后,在向后查詢的時候確保在匹配到之前不再在有,不然的話就要有可以出錯的情況。 Select regexp_substr('asdfafdmaindafda','[^]+') from dualOutput: mainda在這個例子中,我們在main之后還在da,這樣的話,如果我們沒有添加^,正則表達(dá)式就會向后繼續(xù)去匹配,直到最后一個為至,這樣就會出現(xiàn)偏差 這個通常用來實現(xiàn)字符串的列傳行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from dualconnect by rownum = length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1這里length這里操作是先得到有多少個“;”,再通過 connect by rownum方式來做一行成多行的操作,在變成多行之后,可以通過regexp_substr來取字符串的操作 接著上一個例子a,b,c,d,e,d,f,a,n這樣的一個字符串,我們現(xiàn)在要把字符串里一些重復(fù)去掉,這樣的話結(jié)果是a,b,c,d,e,f,n去掉了d與a的兩個字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from dualconnect by rownum=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通過轉(zhuǎn)成多行的,再用distinct 去掉重復(fù),然后我們再通過wm_concat來字符串合并來完成。 再來一個ip格式轉(zhuǎn)換的例子吧,我們一般的IP的格式是12.19.168.27現(xiàn)在要不足3位的補足前面為0,結(jié)果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum5order by rownum) 來一個驗證IP是數(shù)字是否正確select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum5)where new_value=0 and new_value256having count(*) =4 來一個IP字符串格式轉(zhuǎn)換成數(shù)字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from dualconnect by rownum=4) 接下來介紹一個regexp_instr函數(shù) REGEXP_INSTR 函數(shù)使用正則表達(dá)式返回搜索模式的起點和終點。REGEXP_INSTR 的語法如下所示。REGEXP_INSTR 返回一個整數(shù),指出搜索模式的開始或結(jié)束的位置,如果沒有發(fā)現(xiàn)匹配的值,則返回0。 語法: 2.REGEXP_INSTR與INSTR函數(shù)相同,返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 與REGEXP_SUBSTR一樣,它也有變量pattern、position(開始位置)、occurrence 和match_parameter;這里主要介紹一下新參數(shù)return_option 的作用,它允許用戶告訴Oracle,模式出現(xiàn)的時候,要返回什么內(nèi)容。 Select regexp_instr('asdfafdmaindafda','sd') from dualOutput:2這里去查詢sd的位置,這個和instr是在相同的 Select regexp_instr('asdfafdmaindafda','da',1,2) from dual這里是查詢da第二出現(xiàn)的位置 還有我們經(jīng)常會遇到一種情況是,查詢某個字段,如果是等于“上海”或“北京”或者我們溫州就寫成大城市,其它的寫成小城市,我們一般會考慮使用decode這種方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'溫州' ,'大城市','小城市') from dual只有兩個我們可能覺的sql也不是很冗長,如果有四五個的話,就有點長了,這里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|溫州)'),0,'小城市', '大城市') from dual通過regexp_instr不匹配時為0的條件,這樣就可以完成了 最后一個函數(shù)regexp_replaceREGEXP_REPLACE 函數(shù)是用另外一個值來替代串中的某個值。例如,可以用一個匹配數(shù)字來替代字母的每一次出現(xiàn)。REGEXP_REPLACE的格式如下所示 語法: 4.REGEXP_REPLACE與REPLACE函數(shù)相同,替換原字符串中的字符內(nèi)容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 這個替換函數(shù)還是一個非常好用的。如我們在有一個字符串a(chǎn)dfadfa (main) next 現(xiàn)在我們要把()替換成,這里我們可能想用replace就可以搞定了,但是我們現(xiàn)在做的是(之后必須有)這樣的()我們才替換把.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','\2') from dualoutput: adfadfa main next這里還是一個\做為轉(zhuǎn)義字符。 再來一個ip格式轉(zhuǎn)換的例子吧,我們一般的IP的格式是12.19.168.27現(xiàn)在要不足3位的補足前面為0,結(jié)果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from dualoutput: 012.019.168.027這里我分成兩步來操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先讓每個小字符串做添加0,這樣每個字符串都會大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')這整個字符串分成8段,這樣我們只要2、4、6、8這四個段就可以了。 下面一個例子中,在每兩個字符之間插入一個空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM dual; Output: Y A H O O這個用一個循環(huán)的方式去操作,還蠻很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from dual接著剛才那個,我們可以把replace循環(huán)替換的方式來操作。
為驛城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及驛城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、驛城網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
匹配完整域名的正則表達(dá)式:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}表達(dá)的意思如下:
一個完整的域名,由根域名、頂級域名、二級域名、三級域名……構(gòu)成,每級域名之間用點分開,每級域名由字母、數(shù)字和減號構(gòu)成(第一個字母不能是減號),不區(qū)分大小寫,長度不超過63。
(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?表達(dá)的意思如下:
完整的域名至少包括兩個名字(比如google.com,由google和com構(gòu)成),最后可以有一個表示根域的點(在規(guī)范中,最后有一個點的才是完整域名,但一般認(rèn)為包括兩個以上名字的域名也是完整域名,哪怕后面沒有點)。
oracle的正則表達(dá)式(10g才可以用)
oracle的正則表達(dá)式(regular expression)簡單介紹
目前,正則表達(dá)式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括*nix(Linux, Unix等),HP等操作系統(tǒng),PHP,C#,Java等開發(fā)環(huán)境。
Oracle 10g正則表達(dá)式提高了SQL靈活性。有效的解決了數(shù)據(jù)有效性,重復(fù)詞的辨認(rèn), 無關(guān)的空白檢測,或者分解多個正則組成的字符串等問題。
Oracle 10g支持正則表達(dá)式的四個新函數(shù)分別是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
它們使用POSIX 正則表達(dá)式代替了老的百分號(%)和通配符(_)字符。
特殊字符:
'^' 匹配輸入字符串的開始位置,在方括號表達(dá)式中使用,此時它表示不接受該字符集合。
'$' 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或'\r'。
'.' 匹配除換行符 \n之外的任何單字符。
'?' 匹配前面的子表達(dá)式零次或一次。
'*' 匹配前面的子表達(dá)式零次或多次。
'+' 匹配前面的子表達(dá)式一次或多次。
'( )' 標(biāo)記一個子表達(dá)式的開始和結(jié)束位置。
'[]' 標(biāo)記一個中括號表達(dá)式。
'{m,n}' 一個精確地出現(xiàn)次數(shù)范圍,m=出現(xiàn)次數(shù)=n,'{m}'表示出現(xiàn)m次,'{m,}'表示至少出現(xiàn)m次。
'|' 指明兩項之間的一個選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫字母或數(shù)字組合成的字符串。
\num 匹配 num,其中 num 是一個正整數(shù)。對所獲取的匹配的引用。
正則表達(dá)式的一個很有用的特點是可以保存子表達(dá)式以后使用,被稱為Backreferencing. 允許復(fù)雜的替換能力
如調(diào)整一個模式到新的位置或者指示被代替的字符或者單詞的位置. 被匹配的子表達(dá)式存儲在臨時緩沖區(qū)
中,緩沖區(qū)從左到右編號, 通過\數(shù)字符號訪問。 下面的例子列出了把名字 aa bb cc 變成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 轉(zhuǎn)義符。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數(shù)字。
[[:alnum:]] 任何字母和數(shù)字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[unct:]] 任何標(biāo)點符號。
[[:xdigit:]] 任何16進(jìn)制的數(shù)字,相當(dāng)于[0-9a-fA-F]。
各種操作符的運算優(yōu)先級
\ 轉(zhuǎn)義符
(), (?, (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和順序
| “或”操作
--測試數(shù)據(jù)
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('22113344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find duplicate words.');
commit;
一、REGEXP_LIKE
select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]]+$') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]]+') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
三、REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
四、REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
把TIMEID后面的空格看做字符串的一部分就可以了?!癟IMEID ”然后把“TIMEID ”替換為“201205010000 ”。
同理,比把“V_PART)”看一個字符串,替換為“PART_20120501)”
Oracle g Release 為了與文本字符串中的模式相匹配 添加了對POSIX正則表達(dá)式的支持 Release 用一些附加的可以在Perl找到的元字符 擴(kuò)充了最初的模式元字符目錄 如果你正在用Oracle gR 開發(fā)腳本 那么就看看本文里這些搜索文本的有效捷徑
首先 簡短概述一下:函數(shù)REGEXP_LIKE針對一種模式搜索一個字符列 返回一個TRUE或FALSE的邏輯值 你可以在SQL SELECT語句的WHERE子句中用它來限定行數(shù) 或者在PL/SQL塊中檢查數(shù)據(jù)的有效性 相似的函數(shù)——REGEXP_REPLACE REGEXP_SUBSTR和REGEXP_INSTR——都能夠在執(zhí)行其他常見的字符串操作時 接受POSIX正則表達(dá)式
Perl為POSIX 類 表達(dá)式添加了一些簡短的模式 例如 在標(biāo)準(zhǔn)的POSIX正則表達(dá)式中 你用符號 [[:digit:]] 來表示一個從 到 的阿拉伯?dāng)?shù)字 在Perl中 它被簡化成 \d 大括號表示一次重復(fù)計數(shù) 因此 \d{ } 規(guī)定了三個阿拉伯?dāng)?shù)字 要表示你想要一個除阿拉伯?dāng)?shù)字之外的字符 POSIX模式是 [^[:digit:]] 但是在Perl中 它只表示為 \D
類似的捷徑對于空白也存在: \s 與 [[:space:]] 相對應(yīng) 非空白: \S 對應(yīng) [^[:space:]] 列表A中顯示了一個取自人力資源方案的例子 列表A
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE(last_name [[:space:]] );
LAST_NAME
De Haan
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name \s );
LAST_NAME
De Haan
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name \S ) AND ROWNUM ;
LAST_NAME
AbelAnde
Atkinson
Austin
BaerBaida
Banda
Bates
Bell
Bernstein
rows selected
Perl通過對運算符添加(?) 用 非貪婪型 匹配運算符擴(kuò)充了POSIX中的 貪婪型 匹配運算符 例如 符號 ^ { } 與至少兩個 最多五個 開頭的值相匹配 但是 解釋是 貪婪的 它盡可能地與最長的字符串相匹配 如果列中包括了 這種符號將與前五個 匹配 但是 符號 ^ { }? 是 非貪婪的 它與最短的字符串匹配 這樣 就只有兩個 了 列表B中是一個利用REGEXP_SUBSTR的例子
列表B
SQL CREATE TABLE testtab (x VARCHAR ( ));
Table created
SQL BEGIN? ??? FOR i IN LOOP? ????? INSERT INTO testtab VALUES (LPAD( i ));? ??? END LOOP;? ? END;? ? /
PL/SQL procedure successfully pleted
SQL SELECT x FROM testtab;
X?????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????
rows selected
SQL SELECT REGEXP_SUBSTR(x ^ { } )? ? FROM testtab;
REGEXP_SUB????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????
rows selected
SQL SELECT REGEXP_SUBSTR(x ^ { }? )? ? FROM testtab;
REGEXP_SUB????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????
rows selected ?
lishixinzhi/Article/program/Oracle/201311/17650
REGEXP_COUNT 的語法如下所示:
REGEXP_COUNT ( source_char, pattern [, position [, match_param]])
REGEXP_COUNT 返回pattern 在source_char 串中出現(xiàn)的次數(shù)。如果未找到匹配,則函數(shù)返回0。position 變量告訴Oracle 在源串的什么位置開始搜索。在開始位置之后每出現(xiàn)一次模式,都會使計數(shù)結(jié)果增加1。
match_param 變量支持下面幾個值:
‘i’ 用于不區(qū)分大小寫的匹配
‘c’ 用于區(qū)分大小寫的匹配
‘n’ 允許句點(.)作為通配符去匹配換行符。如果省略該參數(shù),則句點將不匹配換行符
‘m’ 將源串視為多行。即Oracle 將^和$分別看作源串中任意位置任何行的開始和結(jié)束,而不是僅僅看作整個源串的開始或結(jié)束。如果省略該參數(shù),則Oracle將源串看作一行。
‘x’ 忽略空格字符。默認(rèn)情況下,空格字符與自身相匹配。
如果為match_param 指定了多個相互矛盾的值,那么Oracle 使用最后一個值。
可以用REGEXP_COUNT 來修改本章前面的LENGTH 示例??梢詫⑾旅娴恼Z法
select (LENGTH('GEORGE') - LENGTH(REPLACE('GEORGE', 'GE', NULL)) ) / LENGTH('GE') AS Counter
from DUAL;
COUNTER
-------
2
用如下語法來代替,得到的結(jié)果是相同的:
select REGEXP_COUNT('GEORGE','GE',1,'i')
from DUAL;
用REGEXP_COUNT 取代LENGTH 還有一個好處,即可以進(jìn)行不區(qū)分大小寫的搜索,因此,前面的查詢也可以寫成下面這樣:
select REGEXP_COUNT('GEORGE','ge',1,'i')
from DUAL;